Resolver una recurrencia significa encontrar una fórmula cerrada que calcule aₙ directamente a partir de n, sin generar todos los términos intermedios. Es una herramienta clave para analizar algoritmos y sucesiones discretas.
En el tema anterior aprendimos a **definir** relaciones de recurrencia y a generar términos paso a paso. Ese método es correcto pero ineficiente si necesitamos, por ejemplo, el término número 10 000.
La **resolución de recurrencias** busca una expresión explícita aₙ = f(n) que produzca el mismo valor que la definición recursiva. Esta fórmula cerrada permite evaluar cualquier término en tiempo constante (o casi constante) y comprender el crecimiento de la sucesión.
Una **fórmula cerrada** (o solución explícita) de una sucesión es una expresión que calcula aₙ usando solo n y constantes, sin referirse a otros términos de la sucesión:
Verificar que una fórmula cerrada es correcta consiste en comprobar que produce los mismos valores que la recurrencia para todos los n del dominio.
La técnica más accesible para resolver recurrencias simples es la **sustitución iterativa**: expandir la recurrencia reemplazando repetidamente cada término por su definición hasta detectar un patrón.
Ejemplo: Resolver aₙ = 2·aₙ₋₁ + 1 con a₁ = 1.
Tras k sustituciones se reconoce una progresión geométrica en la suma, lo que permite cerrar la expresión.
Homogénea: aₙ = r · aₙ₋₁ con a₁ dado.
No homogénea: aₙ = r · aₙ₋₁ + s con r ≠ 1.
Orden 2 (introducción): Para recurrencias como Fibonacci aₙ = aₙ₋₁ + aₙ₋₂, se buscan soluciones de la forma aₙ = c · λⁿ, lo que conduce a la **ecuación característica** λ² = λ + 1. Su estudio completo excede el nivel básico, pero el principio es el mismo: convertir la recurrencia en una ecuación algebraica.
El simulador compara, para cada n, el valor obtenido **generando términos con la recurrencia** frente al calculado con la **fórmula cerrada**. Si la resolución es correcta, ambas columnas coinciden (marca ✓). Avanza fila a fila para verificar la equivalencia.
En la práctica, conviene implementar ambos métodos: la recurrencia iterativa para generar términos y la fórmula cerrada para evaluar posiciones lejanas con eficiencia. Comparar ambos resultados sirve como prueba de la solución.
// Calcular a_n por recurrencia iterativa
function porRecurrencia(n, a1, paso) {
let actual = a1;
for (let i = 2; i <= n; i++) {
actual = paso(actual);
}
return actual;
}
// Fórmulas cerradas resueltas
const cerradaGeometrica = (n) => 3 * Math.pow(2, n - 1);
const cerradaAritmetica = (n) => 5 + (n - 1) * 2;
const cerradaNoHomogenea = (n) => Math.pow(2, n) - 1;
function verificar(n, recurrencia, cerrada, etiqueta) {
const vRec = porRecurrencia(n, recurrencia.a1, recurrencia.paso);
const vCer = cerrada(n);
const ok = vRec === vCer;
console.log(`${etiqueta} n=${n}: rec=${vRec}, cerrada=${vCer} → ${ok ? 'OK' : 'ERROR'}`);
return ok;
}
verificar(10,
{ a1: 1, paso: (x) => 2 * x + 1 },
cerradaNoHomogenea,
"No homogénea"
);
// No homogénea n=10: rec=1023, cerrada=1023 → OK
console.log("a_20 geométrica (cerrada):", cerradaGeometrica(20));
// a_20 geométrica (cerrada): 1572864
Las técnicas básicas de resolución permiten transformar definiciones recursivas en fórmulas explícitas, facilitando el análisis de complejidad y el cálculo de términos lejanos. Con esto cerramos el bloque de sucesiones y recurrencias del curso.
A partir del próximo tema cambiamos de dominio: estudiaremos la **introducción a funciones booleanas**, funciones cuyas entradas y salidas son valores de verdad, fundamentales para la lógica digital y la programación condicional.