Una recurrencia expresa el conteo de un problema en función de conteos de tamaños menores, junto con casos iniciales que permiten comenzar el cálculo.
Muchos problemas combinatorios se vuelven más sencillos cuando observamos cómo se relaciona un caso grande con casos pequeños. En lugar de contar directamente todas las configuraciones de tamaño n, clasificamos según la primera decisión y usamos resultados ya conocidos.
Una relación de recurrencia describe esa dependencia. Para obtener valores concretos necesitamos también condiciones iniciales.
Una recurrencia define cada término de una sucesión utilizando uno o varios términos anteriores.
En combinatoria, an suele representar la cantidad de configuraciones de un problema de tamaño n.
Sin casos base, una recurrencia no permite calcular ningún valor concreto.
Consideremos:
Los valores son:
La sucesión cuenta configuraciones en las que cada etapa duplica las posibilidades.
Elige el tipo de recurrencia y la cantidad de términos. La simulación muestra la sucesión generada paso a paso.
Una técnica común consiste en clasificar una configuración según su último elemento o su última etapa. Si una solución termina de una forma o de otra, sumamos los conteos de ambos casos.
La suma indica que cada configuración termina en uno de dos tipos de casos excluyentes.
Supongamos que queremos cubrir una fila de n posiciones usando piezas de longitud 1 o 2. Una solución puede terminar con:
La recurrencia de cobertura puede calcularse de forma iterativa.
function formasDeCubrir(n) {
if (n === 0 || n === 1) return 1;
let anteriorDos = 1;
let anteriorUno = 1;
for (let posicion = 2; posicion <= n; posicion += 1) {
const actual = anteriorUno + anteriorDos;
anteriorDos = anteriorUno;
anteriorUno = actual;
}
return anteriorUno;
}
console.log(formasDeCubrir(6));
El algoritmo conserva solo los dos valores anteriores porque son los únicos necesarios para calcular el siguiente.
Una recurrencia correcta debe dividir las configuraciones en casos:
Si una configuración pertenece a dos casos, se contará dos veces. Si no pertenece a ninguno, quedará fuera del resultado.
Los casos base representan los problemas más pequeños que podemos resolver directamente.
Una recurrencia es una relación matemática. Una función recursiva es una implementación que se llama a sí misma. Ambas ideas están relacionadas, pero no son exactamente lo mismo.
| Concepto | Descripción |
|---|---|
| Recurrencia | Define un valor mediante términos anteriores. |
| Recursión | Implementa una función que se invoca con un problema menor. |
| Iteración | Calcula sucesivamente los valores sin llamadas anidadas. |
La recurrencia permite resolver problemas combinatorios relacionando configuraciones grandes con casos más pequeños. Definir correctamente los casos base y la división en situaciones es tan importante como realizar el cálculo.
En el próximo tema estudiaremos relaciones de recurrencia aplicadas directamente al conteo.