Una relación de recurrencia expresa cada término de una sucesión en función de los anteriores. Junto con condiciones iniciales, define de forma compacta sucesiones que no siguen necesariamente un patrón aritmético o geométrico simple.
En el tema anterior vimos sucesiones con reglas explícitas sencillas (progresiones aritméticas y geométricas). Sin embargo, muchas sucesiones en matemáticas discretas y ciencias de la computación se definen de manera **recursiva**: cada valor depende de uno o más valores previos.
Una **relación de recurrencia** es la ecuación que formaliza esa dependencia. Es el puente entre las funciones recursivas (tema 32), las sucesiones (tema 33) y los algoritmos que calculan términos paso a paso.
Una relación de recurrencia para la sucesión { aₙ } es una ecuación que expresa aₙ en términos de términos anteriores:
La función F determina cómo se combinan los términos previos. El entero k es el **orden** de la recurrencia: indica cuántos términos anteriores intervienen directamente. Cuanto mayor es el orden, más información inicial se necesita para generar la sucesión.
La relación de recurrencia por sí sola no determina una única sucesión. Es necesario fijar los **valores iniciales** de los primeros términos para que la regla pueda aplicarse:
Sin condiciones iniciales, la ecuación admite infinitas sucesiones posibles. Con ellas, cada término queda univocamente determinado.
Orden 1 — Progresión aritmética como recurrencia:
Orden 1 — Progresión geométrica como recurrencia:
Orden 2 — Sucesión de Fibonacci:
Orden 1 no homogénea:
El simulador construye la sucesión aplicando la relación de recurrencia paso a paso. Observa cómo cada nuevo término (resaltado en azul) se calcula a partir de los términos previos (conectados con flechas). Las condiciones iniciales aparecen en verde porque no requieren aplicar la recurrencia.
Implementar una relación de recurrencia en código equivale a calcular cada término usando los anteriores, ya sea con un bucle iterativo (almacenando los valores previos) o con una función recursiva.
// Fibonacci iterativo (orden 2)
function fibonacciIterativo(n) {
if (n <= 0) return 0;
if (n === 1) return 1;
let aPrev2 = 1; // a_1
let aPrev1 = 1; // a_2
for (let i = 3; i <= n; i++) {
const actual = aPrev1 + aPrev2;
aPrev2 = aPrev1;
aPrev1 = actual;
}
return aPrev1;
}
// Recurrencia general con arreglo de términos
function generarSucesion(iniciales, recurrencia, cantidad) {
const terminos = [...iniciales];
while (terminos.length < cantidad) {
terminos.push(recurrencia(terminos));
}
return terminos;
}
const aritmetica = generarSucesion(
[5],
(prev) => prev[prev.length - 1] + 3,
6
);
const fib = generarSucesion(
[1, 1],
(prev) => prev[prev.length - 1] + prev[prev.length - 2],
8
);
console.log("Aritmética:", aritmetica);
// Aritmética: [5, 8, 11, 14, 17, 20]
console.log("Fibonacci:", fib);
// Fibonacci: [1, 1, 2, 3, 5, 8, 13, 21]
console.log("fibonacciIterativo(10) =", fibonacciIterativo(10));
// fibonacciIterativo(10) = 55
Las relaciones de recurrencia permiten describir sucesiones complejas con reglas compactas. Aparecen en el análisis de algoritmos (como las recurrencias de divide y vencerás), en combinatoria y en modelos de crecimiento poblacional discreto.
Definir la recurrencia es solo el primer paso. En el próximo tema estudiaremos la **resolución básica de recurrencias**, aprendiendo técnicas para obtener fórmulas cerradas que calculen aₙ directamente sin generar todos los términos intermedios.