Tema 41: Números de Fibonacci y problemas combinatorios

Estudiar la sucesión de Fibonacci y reconocerla en problemas de conteo, recorridos y descomposición de estructuras.

1. ¿Qué son los números de Fibonacci?

La sucesión de Fibonacci comienza con 0 y 1. Cada término posterior se obtiene sumando los dos términos anteriores:

F0 = 0, F1 = 1

Fn = Fn-1 + Fn-2, para n ≥ 2.

Sus primeros términos son: 0, 1, 1, 2, 3, 5, 8, 13, 21, ...

2. Una definición combinatoria

Fibonacci no es solo una sucesión numérica. También aparece cuando una estructura puede construirse de dos maneras principales, y cada manera se reduce a un problema más pequeño.

Cuando el número de soluciones de tamaño n es la suma de las soluciones de tamaños n - 1 y n - 2, surge una recurrencia de Fibonacci.

3. Condiciones iniciales

Una recurrencia no queda completamente definida sin sus casos iniciales. Para Fibonacci se utilizan habitualmente F0 = 0 y F1 = 1.

En problemas de conteo, esos valores representan los casos más pequeños: una estructura vacía, una posición, un paso o una cadena de longitud mínima.

4. Cálculo iterativo

La versión iterativa conserva únicamente los dos términos anteriores. Su tiempo de ejecución es lineal respecto de n y utiliza una cantidad constante de memoria.

function fibonacciIterativo(n) {
  if (n < 0) return null;
  let anterior = 0;
  let actual = 1;
  for (let i = 0; i < n; i++) {
    const siguiente = anterior + actual;
    anterior = actual;
    actual = siguiente;
  }
  return anterior;
}

console.log(fibonacciIterativo(10)); // 55

5. Cálculo recursivo

La definición matemática puede traducirse directamente a una función recursiva. Es clara para estudiar la recurrencia, pero repite muchos cálculos cuando n crece.

function fibonacciRecursivo(n) {
  if (n <= 1) return n;
  return fibonacciRecursivo(n - 1) + fibonacciRecursivo(n - 2);
}

console.log(fibonacciRecursivo(8)); // 21
La implementación recursiva simple tiene crecimiento exponencial. Para entradas grandes conviene usar iteración o memorización.

6. Memorización

La memorización guarda los resultados ya calculados. Así, cada término se obtiene una sola vez y la solución pasa a tener tiempo lineal.

function fibonacciMemorizado(n, memoria = {}) {
  if (n <= 1) return n;
  if (memoria[n] !== undefined) return memoria[n];
  memoria[n] = fibonacciMemorizado(n - 1, memoria)
             + fibonacciMemorizado(n - 2, memoria);
  return memoria[n];
}

console.log(fibonacciMemorizado(20)); // 6765

7. Escaleras de uno y dos pasos

Supongamos que una escalera tiene n escalones y en cada movimiento se puede subir uno o dos escalones. Sea an la cantidad de recorridos posibles.

El último movimiento puede ser de un escalón, dejando n - 1 escalones, o de dos, dejando n - 2. Por lo tanto:

an = an-1 + an-2

Con a0 = 1 y a1 = 1, resulta an = Fn+1.

8. Cadenas sin símbolos consecutivos

Consideremos cadenas formadas con A y B sin dos B consecutivas. Si una cadena válida termina en A, antes puede haber una cadena válida de longitud n - 1. Si termina en B, el símbolo anterior debe ser A, y queda una cadena válida de longitud n - 2.

La cantidad de cadenas vuelve a satisfacer la recurrencia de Fibonacci.

9. Baldosas de longitud uno y dos

Una fila de longitud n puede cubrirse con baldosas de longitud 1 o 2. Al observar la última baldosa, las posibilidades se separan en dos casos:

  • Una baldosa de longitud 1 y una cobertura de longitud n - 1.
  • Una baldosa de longitud 2 y una cobertura de longitud n - 2.

La cantidad de coberturas es, nuevamente, Fn+1.

10. Recorridos en un tablero

Un recorrido sobre una línea en el que solo se permiten saltos de tamaño 1 o 2 tiene tantos caminos como el problema de la escalera. En una grilla, una restricción similar puede producir Fibonacci cuando cada estado depende de los dos estados anteriores.

Este patrón aparece en planificación de movimientos, validación de secuencias y conteo de configuraciones.

11. Relación con el crecimiento áureo

El cociente entre términos consecutivos se aproxima al número áureo:

φ = (1 + √5) / 2 ≈ 1,618

Para valores grandes de n, Fn+1 / Fn se acerca a φ.

Esta relación permite estimar el crecimiento de la sucesión, aunque para contar estructuras concretas siempre deben respetarse las condiciones iniciales y la recurrencia correspondiente.

12. Identificar el patrón

Para reconocer un problema de Fibonacci conviene seguir este procedimiento:

  1. Definir con precisión qué representa an.
  2. Separar las posibilidades según la última decisión.
  3. Comprobar si los casos producen tamaños n - 1 y n - 2.
  4. Establecer los casos iniciales.
  5. Verificar la recurrencia con valores pequeños.

13. Simulación: recorridos de una escalera

Elige la cantidad de escalones y observa cuántas formas existen de llegar al final usando pasos de uno o dos escalones.

Configura la cantidad de escalones y pulsa «Calcular recorridos».
Escalones nRecorridosRegla aplicada

14. Fibonacci en informática

La sucesión aparece en programación dinámica, análisis de algoritmos, generación de secuencias, recorridos y problemas de cobertura. El interés no está únicamente en calcular Fibonacci, sino en reconocer la estructura de una solución que se divide en subproblemas superpuestos.

15. Resumen

Los números de Fibonacci modelan problemas donde cada solución se obtiene combinando soluciones de tamaños n - 1 y n - 2. Las escaleras, las cadenas restringidas, las baldosas y ciertos recorridos son ejemplos combinatorios clásicos. La iteración y la memorización permiten calcular los términos con eficiencia lineal.