Fibonacci en C: ejercicio resuelto
Fibonacci en C: ejercicio resuelto
Si buscas Fibonacci en C ejercicio resuelto, aquí tienes tres implementaciones con análisis de complejidad: la versión recursiva clásica (O(2^n)), la iterativa (O(n)) y la recursiva con memoización (O(n)).
La sucesión de Fibonacci es el ejemplo canónico para entender la diferencia entre una solución recursiva ingenua y una dinámica: el mismo subproblema se resuelve exponencialmente más veces sin caché.
Enunciado
Implementa tres funciones que devuelvan el n-ésimo número de Fibonacci (F(0)=0, F(1)=1):
fib_recursivo(n): versión recursiva sin caché.fib_iterativo(n): versión iterativa con O(1) de espacio.fib_memo(n): versión recursiva con tabla de memoización.
Imprime los primeros 10 términos con cada versión.
Solución en C
Resultado esperado
Errores frecuentes
- No definir el caso base: sin
if (n <= 1) return nla recursión es infinita y provoca un desbordamiento de pila. - Usar
intparangrandes: F(47) supera el rango deint(2.147.483.647); usarlong longevita el desbordamiento hasta F(92). - Olvidar inicializar la tabla de memo a cero: con
staticla memoria ya está a cero, pero si se declara en la pila hay que llamar amemset. - Comparar la velocidad de la versión recursiva para
n > 40: el tiempo crece exponencialmente y puede bloquear el programa durante segundos.
Aplicación práctica
Fibonacci aparece en el análisis de algoritmos de divide y vencerás, en el cálculo de la complejidad de quicksort en el peor caso y en estructuras como los árboles de Fibonacci. La técnica de memoización es el primer paso hacia la programación dinámica.
Siguiente ejercicio recomendado
- Recursividad en C: ejercicios resueltos
- Factorial en C: ejercicio resuelto
- Criba de Eratóstenes en C: ejercicio resuelto
- Todos los ejercicios de C
Práctica guiada y libro completo
Si quieres una ruta completa con progresión real de dificultad:
FAQ
¿Por qué la versión recursiva es tan lenta para valores grandes?
Porque recalcula los mismos subproblemas múltiples veces. Para calcular F(5) se llama a F(3) dos veces y a F(2) tres veces. La complejidad es O(2^n): para F(40) se realizan más de mil millones de llamadas recursivas.
¿Cuándo usar la versión iterativa frente a la memoizada?
La iterativa es preferible cuando solo necesitas el n-ésimo término: usa O(1) de espacio. La memoizada es útil cuando necesitas múltiples términos en distintos momentos (llamadas separadas), ya que reutiliza el caché entre ellas.
¿Existe una fórmula directa para calcular F(n)?
Sí: la fórmula de Binet, F(n) = (φ^n − ψ^n) / √5 donde φ = (1+√5)/2. Sin embargo, usa double y acumula errores de redondeo para n > 70, por lo que en C se prefiere la versión iterativa con enteros de 64 bits.