Fibonacci sin recursión lenta: de LAMBDA exponencial a fórmula instantánea
Un ingeniero industrial del grupo implementa Fibonacci con LAMBDA recursiva (Fibonacci(n-1)+Fibonacci(n-2)), pero a partir de n=35 la fórmula tarda más de un minuto. El motivo: cada llamada genera dos sub-llamadas, creciendo exponencialmente (2^35 = ~34 mil millones de evaluaciones).
La comunidad propone dos enfoques radicalmente diferentes:
Fibonacci iterativo con APILARV + TOMAR (Héctor): construye la secuencia paso a paso, apilando cada nuevo valor calculado a partir de los dos últimos:
``
=LET(
F; LAMBDA(F; arr; n;
SI(FILAS(arr) >= n; arr;
F(F; APILARV(arr; SUMA(TOMAR(arr; -2))); n)
)
);
INDICE(F(F; {1; 1}; A1); A1)
)
`
Complejidad lineal O(n) en vez de exponencial.
Fórmula cerrada de Binet (Leo): la solución matemática directa. No necesita recursión ni iteración — calcula el resultado en una sola evaluación:
`
=LET(
n; 40;
k; 5^0,5;
(((1 + k) / 2)^n - ((1 - k) / 2)^n) / k
)
`
Donde k = √5 y la fórmula usa la proporción áurea (1+√5)/2`. Resultado instantáneo para cualquier n.
El autor confirma que la fórmula de Leo es "impecable: exacta y super rápida". Un caso que ilustra bien cómo pensar en el algoritmo (iterativo vs recursivo vs analítico) es más importante que optimizar la fórmula.
El problema: Fibonacci que tarda un minuto
Un ingeniero industrial del grupo implementó la sucesión de Fibonacci con una LAMBDA recursiva clásica: cada término es la suma de los dos anteriores. Elegante sobre el papel, pero a partir de n=35 la fórmula tardaba más de un minuto en calcular. ¿Por qué?
Porque esa recursión es exponencial. Cada llamada genera dos sub-llamadas, que a su vez generan dos cada una... Para n=35 son del orden de miles de millones de evaluaciones, la mayoría repetidas. La comunidad respondió con dos enfoques que atacan el problema desde ángulos opuestos.
Enfoque 1: iterativo con APILARV + TOMAR
Héctor cambió la recursión que se ramifica por una que construye la secuencia paso a paso, apilando cada nuevo término a partir de los dos últimos:
=LET(
F; LAMBDA(F; arr; n;
SI(FILAS(arr) >= n; arr;
F(F; APILARV(arr; SUMA(TOMAR(arr; -2))); n)
)
);
INDICE(F(F; {1; 1}; A1); A1)
)TOMAR(arr; -2) coge los dos últimos valores, SUMA los suma y APILARV añade el resultado a la lista. La recursión avanza una sola vez por término, así que el coste es lineal en lugar de exponencial. Para n=35 pasa de un minuto a instantáneo.
Enfoque 2: la fórmula cerrada de Binet
Leo fue directo a las matemáticas. Existe una fórmula cerrada para Fibonacci —la fórmula de Binet— que da el término n-ésimo sin recursión ni iteración, en una única evaluación:
=LET(
n; A1;
k; 5^0,5;
(((1 + k) / 2)^n - ((1 - k) / 2)^n) / k
)Donde k es la raíz de 5 y (1+k)/2 es la famosa proporción áurea. El resultado es inmediato para cualquier n, porque no recorre nada: simplemente evalúa una expresión. El autor del caso la calificó de "impecable: exacta y súper rápida".
Iterativo vs analítico: qué elegir
Las dos soluciones son mucho mejores que la recursión ramificada, pero no son idénticas. La iterativa te da toda la secuencia hasta n, lo cual es útil si necesitas la lista completa, y es exacta con enteros para cualquier tamaño. La de Binet es la más rápida y compacta, ideal cuando solo quieres el término n; su único matiz es que, al trabajar con potencias de números irracionales, en valores muy grandes puede aparecer un pequeñísimo error de redondeo de coma flotante.
Funciones clave
LAMBDArecursiva: se llama a sí misma; hay que controlar cómo crece el número de llamadas.- iteración con
APILARV: construye la secuencia en una pasada lineal. TOMAR: extrae los últimos elementos ya calculados.SUMAy potencia (^): la base de la fórmula de Binet.
Conclusión
El caso ilustra una lección que va mucho más allá de Fibonacci: el algoritmo importa más que la fórmula. La misma función, escrita como recursión exponencial, tarda un minuto; pensada como iteración lineal o como fórmula analítica, es instantánea. Antes de optimizar celdas, conviene preguntarse si el enfoque de fondo es el correcto. Reflexiones así surgen cada semana en la comunidad de InflueXcel.
Más casos con estas funciones
Más contenido de Excel en InflueXcel
- Generar la serie de Fibonacci con REDUCE, APILARV y LAMBDA CasoInteresante ejercicio compartido en la comunidad: generar los primeros N números de la serie de Fibonacci usando exclusivamente fórmulas de
- Optimización de REDUCE+APILARV con LAMBDA recursiva en bisección CasoAlejandro plantea un reto de rendimiento interesante: tiene una fórmula LET enorme que calcula la permanencia de carga en puerto por matrícu
- Cálculos iterativos con REDUCE y APILARV en Excel CasoLa comunidad aborda un caso sobre cómo trabajar con bucles iterativos en Excel usando funciones modernas. Un miembro necesita realizar cálcu
- Serie de Fibonacci con LAMBDA y REDUCE en una sola fórmula CasoSurge un reto interesante en la comunidad: generar la serie de Fibonacci con una sola fórmula de Excel, sin celdas auxiliares ni macros. Un
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- Reestructurar datos apilados con LAMBDA y PIVOTARPOR CasoUn miembro de la comunidad comparte un archivo de revisión de Seguridad Social con una tabla amplia (34 columnas x 1540 filas) en formato "a
- Descomposición de Cholesky con matrices dinámicas: de VBA a LAMBDA+REDUCE CasoJuan Pablo lanza un reto al grupo: tiene una descomposición de Cholesky resuelta con VBA y quiere saber si se puede hacer con matrices dinám
- Excel Inventario LIFO/FIFO Técnica Avanzada con LAMBDA TutorialCómo aplicar la función recursiva en Excel para transformar los tediosos procesos de valoración de inventario, mediante los métodos LIFO y F
- Sustituir SUMAR.SI.CONJUNTO lento por MMULT y BYCOL en análisis de inventario CasoUn miembro desde Ecuador tiene un modelo de inventario con SUMAR.SI.CONJUNTO dentro de una fórmula LET con ELEGIRCOLS y FILTRAR. El problema
- Error #CALC con MAP y AGRUPARPOR: solución con REDUCE+APILARV CasoNuevo reto de Excel resuelto por la comunidad: un usuario necesita aplicar AGRUPARPOR de forma iterativa sobre un rango de códigos de cuenta