14. Resolución de recurrencias sencillas

Resolver una recurrencia consiste en obtener una fórmula explícita para su término n. Esa fórmula permite calcular valores lejanos, estudiar el crecimiento y analizar algoritmos sin expandir cada paso uno por uno.

14.1 Introducción

Una relación de recurrencia describe cómo obtener un término a partir de otros. Sin embargo, si queremos conocer a1000, puede ser incómodo calcular los 999 términos intermedios. Una solución explícita expresa an directamente en función de n.

En este tema resolveremos recurrencias elementales usando expansión o sustitución repetida, reconocimiento de sumas y productos, y verificación final. Son técnicas fundamentales para entender el comportamiento de secuencias y costos de algoritmos.

14.2 Relación recursiva y fórmula explícita

Recurrencia: a0 = 2, an = an-1 + 3.

Fórmula explícita: an = 2 + 3n.

La recurrencia dice cómo avanzar un paso.
La fórmula explícita dice el valor en cualquier índice n.

Una fórmula propuesta solo es solución si cumple tanto la condición inicial como la relación de recurrencia. Comprobar ambas condiciones es parte obligatoria de la resolución.

14.3 Método de expansión

El método de expansión reemplaza repetidamente un término por la regla de recurrencia hasta llegar al término inicial. Al observar el patrón, podemos expresar el resultado en función de n.

an = an-1 + 3
= (an-2 + 3) + 3
= an-2 + 2 · 3
= ...
= a0 + n · 3.

Si a0 = 2, entonces an = 2 + 3n.

La expansión no debe detenerse solo porque vemos algunos términos. Debemos indicar cuántas veces se aplicó la regla y por qué el patrón alcanza el índice inicial.

14.4 Resolver una recurrencia aditiva constante

Consideremos la forma general an = an-1 + d, con a0 = c. Al expandir n veces se obtiene:

an = c + nd.

La sucesión es aritmética. El término inicial aparece una vez y el incremento d aparece una vez por cada paso desde 0 hasta n, es decir, n veces.

a0 = 7, an = an-1 - 2.

an = 7 - 2n.
a5 = 7 - 10 = -3.

14.5 Verificar una solución aditiva

Para verificar an = 7 - 2n, comprobamos primero el caso inicial y luego la regla.

Caso inicial: a0 = 7 - 2·0 = 7.

Relación: an-1 - 2 = [7 - 2(n - 1)] - 2
= 7 - 2n + 2 - 2 = 7 - 2n = an.

La fórmula cumple ambas condiciones.

14.6 Recurrencia aditiva en código

function terminoRecursivoAditivo(inicial, diferencia, n) {
  let valor = inicial;

  for (let i = 1; i <= n; i++) {
    valor += diferencia;
  }

  return valor;
}

function terminoExplicitoAditivo(inicial, diferencia, n) {
  return inicial + n * diferencia;
}

console.log(terminoRecursivoAditivo(7, -2, 5)); // -3
console.log(terminoExplicitoAditivo(7, -2, 5)); // -3

La primera función aplica la relación paso a paso; la segunda usa la solución explícita. Ambas deben coincidir para los valores válidos.

14.7 Resolver una recurrencia multiplicativa

Para an = r an-1 con a0 = c, la expansión produce un producto de r repetido n veces.

an = r an-1
= r(r an-2)
= r2an-2
= ...
= rna0.

Solución: an = crn.

La sucesión es geométrica. Si r = 2, cada paso duplica el valor y la fórmula contiene una potencia de dos.

14.8 Ejemplo: duplicación

a0 = 5
an = 2an-1.

an = 5 · 2n.

a4 = 5 · 16 = 80.

La solución se verifica sustituyendo: 2an-1 = 2(5 · 2n-1) = 5 · 2n, que coincide con la fórmula propuesta.

14.9 Multiplicación recursiva y explícita

function terminoRecursivoMultiplicativo(inicial, factor, n) {
  let valor = inicial;

  for (let i = 1; i <= n; i++) {
    valor *= factor;
  }

  return valor;
}

function terminoExplicitoMultiplicativo(inicial, factor, n) {
  return inicial * factor ** n;
}

console.log(terminoRecursivoMultiplicativo(5, 2, 4)); // 80
console.log(terminoExplicitoMultiplicativo(5, 2, 4)); // 80

14.10 Recurrencias con incremento variable

Consideremos an = an-1 + n, con a0 = 0. Al expandir, aparecen todos los sumandos desde 1 hasta n:

an = an-1 + n
= an-2 + (n - 1) + n
= ...
= a0 + 1 + 2 + ... + n.

Como 1 + 2 + ... + n = n(n + 1)/2,
an = n(n + 1)/2.

Resolver una recurrencia puede reducirse a reconocer una suma conocida. La inducción matemática permite demostrar la fórmula de esa suma.

14.11 Sumas telescópicas

Una suma telescópica tiene términos que se cancelan al sumarse. Por ejemplo, si an = an-1 + 1/[n(n + 1)] con a0 = 0, podemos usar:

1/[n(n + 1)] = 1/n - 1/(n + 1).

Al sumar desde n = 1 hasta N:
(1 - 1/2) + (1/2 - 1/3) + ... + (1/N - 1/(N + 1))
= 1 - 1/(N + 1).

Entonces aN = 1 - 1/(N + 1).

Este método es útil cuando la diferencia entre términos puede descomponerse en dos partes consecutivas que se cancelan.

14.12 Una recurrencia afín: aₙ = raₙ₋₁ + b

La recurrencia an = r an-1 + b combina multiplicación y suma. Si r ≠ 1, la expansión produce una suma geométrica:

an = rna0 + b(1 + r + r2 + ... + rn-1).

Como 1 + r + ... + rn-1 = (rn - 1)/(r - 1),

an = rna0 + b(rn - 1)/(r - 1).

Esta fórmula será útil para muchos modelos. Cuando r = 1, la recurrencia se convierte en la forma aditiva an = an-1 + b.

14.13 Ejemplo: duplicar y sumar uno

Consideremos a0 = 1 y an = 2an-1 + 1. Aplicando la fórmula anterior:

an = 2n · 1 + (2n - 1)/(2 - 1)
= 2n + 2n - 1
= 2n+1 - 1.

Para n = 4: a4 = 25 - 1 = 31.

Podemos verificar sustituyendo la fórmula en la recurrencia: 2(2n - 1) + 1 = 2n+1 - 1.

14.14 Verificar una fórmula afín con código

function recurrenciaAfin(n) {
  let valor = 1;

  for (let i = 1; i <= n; i++) {
    valor = 2 * valor + 1;
  }

  return valor;
}

function formulaAfin(n) {
  return 2 ** (n + 1) - 1;
}

console.log(recurrenciaAfin(4)); // 31
console.log(formulaAfin(4)); // 31

14.15 Método de sustitución para verificar

Una vez que proponemos una fórmula, podemos comprobarla por sustitución. El procedimiento tiene dos pasos:

  1. Verificar que la fórmula produce el valor inicial correcto.
  2. Reemplazar an-1 por la fórmula y comprobar que resulta an.

Para mayor rigor, la verificación general puede formalizarse mediante inducción matemática. El método de sustitución sirve para detectar errores algebraicos y confirmar que una expresión candidata es coherente con la recurrencia.

14.16 Recurrencias de costo sencillas

El tiempo de un algoritmo puede definirse mediante recurrencias. Si una función hace una operación local y luego llama a una versión con tamaño n - 1, podemos tener:

T(0) = c
T(n) = T(n - 1) + d.

Solución: T(n) = c + nd.
El costo crece linealmente con n.

La solución permite pasar de una descripción de llamadas a una conclusión de complejidad. En temas posteriores aplicaremos este razonamiento a algoritmos recursivos más variados.

14.17 Límites de estas técnicas

La expansión y el reconocimiento de sumas resuelven muchas recurrencias simples, pero no todas. Fibonacci, las recurrencias de orden mayor y las recurrencias que dividen el tamaño del problema requieren herramientas adicionales.

RecurrenciaTécnica elementalComentario
an = an-1 + dExpansiónProduce una suma constante.
an = ran-1ExpansiónProduce una potencia.
an = an-1 + nReconocer sumaProduce suma de naturales.
Fn = Fn-1 + Fn-2No basta lo anteriorRequiere métodos de segundo orden.

14.18 Errores frecuentes

  • Olvidar incluir la condición inicial al obtener la fórmula.
  • Aplicar la regla de recurrencia un número incorrecto de veces.
  • Confundir una suma aritmética con una suma geométrica.
  • No verificar que la fórmula satisface la relación y el valor inicial.
  • Usar una fórmula de recurrencia afín con r = 1 sin tratar ese caso aparte.
  • Creer que una fórmula explícita siempre es la implementación más segura para números grandes.

14.19 Qué debes recordar y conclusión

  • Resolver una recurrencia significa obtener una fórmula explícita para an.
  • La expansión reemplaza términos hasta alcanzar la condición inicial.
  • Las recurrencias aditivas producen fórmulas lineales y las multiplicativas producen potencias.
  • Los incrementos variables se convierten en sumas que debemos reconocer o calcular.
  • Las recurrencias afines generan sumas geométricas.
  • Toda fórmula candidata debe verificarse con la condición inicial y la relación de recurrencia.

Las fórmulas explícitas hacen visible el crecimiento de una sucesión y preparan el análisis de algoritmos. En el próximo tema relacionaremos directamente los algoritmos recursivos con las recurrencias que describen su costo.