curso
Secuencia de Fibonacci en Python: Aprende y explora técnicas de codificación
La secuencia de Fibonacci es una forma divertida de seguir practicando Python. En este artículo, aprenderás a implementar la secuencia de Fibonacci en Python utilizando diferentes técnicas de Python, desde escribir funciones eficientes y manejar la recursividad hasta utilizar principios orientados a objetos para obtener soluciones más optimizadas.
Cuando hayas terminado, sigue nuestro curso Escribir funciones en Python para reforzar conceptos como el alcance y la gestión de errores, o prueba nuestro curso Programación orientada a objetos intermedia en Python para aprender sobre la herencia y las clases base. Ahora, probemos la secuencia de Fibonacci.
¿Qué es la Secuencia de Fibonacci?
La secuencia de Fibonacci es un concepto matemático que aparece en muchos ámbitos de la ciencia y la naturaleza. Es una serie de números en la que cada número es la suma de los dos anteriores, empezando por 0 y 1. Este patrón constituye la base de aplicaciones en campos como la informática y las finanzas.
Dos aspectos principales definen la secuencia de Fibonacci: la estructura recursiva de la secuencia y su relación con la proporción áurea.
Naturaleza recursiva de la secuencia de Fibonacci
La secuencia de Fibonacci empieza con 0 y 1. Cada nuevo número es la suma de los dos números anteriores. Por ejemplo:
0 + 1 = 1
1 + 1 = 2
1 + 2 = 3
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
Y así sucesivamente.
Matemáticamente, lo escribimos como F(n) = F(n-1) + F(n-2)
. La secuencia se construye sumando repetidamente los dos últimos números. Los dos primeros números, 0 y 1, son el punto de partida o casos base. Sin ellas, la secuencia no funcionaría.
Este patrón recursivo sirve de base para algunos algoritmos en informática. Por ejemplo, la recursividad en programación funciona sobre esta secuencia al resolver problemas como generar números de Fibonacci o dividir tareas en trozos más pequeños y manejables.
Conexión de la proporción áurea
La secuencia de Fibonacci está estrechamente ligada a la proporción áurea, que es un número irracional representado por φ
(su valor es aproximadamente 1,618). Si divides un número de Fibonacci por el anterior, la proporción se acerca cada vez más a φ
. Por ejemplo:
5 ÷ 3 ≈ 1.666
8 ÷ 5 ≈ 1.6
13 ÷ 8 ≈ 1.625
Cuanto más avanzas, más se acerca a 1,618. No es una coincidencia: la proporción aparece de forma natural en la secuencia de Fibonacci debido a la forma en que crecen los números.
Euclides la describió por primera vez en la antigua Grecia como la razón extrema y media. Desde entonces, se ha relacionado con los patrones de la naturaleza, como las espirales de las conchas y las flores, así como con el arte y la arquitectura.
La proporción áurea en el arte. Fuente
Aplicaciones prácticas de la Secuencia de Fibonacci
La secuencia de Fibonacci aparece de forma sorprendente en muchos campos. Centrémonos en dos de sus aplicaciones más notables: sus patrones en la naturaleza y su uso en informática.
Fibonacci en la naturaleza
Puedes ver la secuencia de Fibonacci en toda la naturaleza. Fíjate en las flores: el número de pétalos suele coincidir con los números de Fibonacci. Por ejemplo, las margaritas pueden tener 34, 55 u 89 pétalos, y los lirios suelen tener 3, 5 u 8. Estos patrones ayudan a las plantas a crecer de forma que aprovechen al máximo la luz solar y la lluvia.
Las espirales de las piñas y los girasoles también siguen los números de Fibonacci. La disposición de las semillas en un girasol, por ejemplo, coincide con la secuencia. Es fascinante cómo algo tan sencillo como sumar dos números puede describir tanto del mundo natural.
Fibonacci en informática
La secuencia de Fibonacci también desempeña un papel clave en algoritmos y estructuras de datos. Por ejemplo, los números de Fibonacci se utilizan en los algoritmos de búsqueda para descomponer los problemas en partes más pequeñas de forma eficaz. La secuencia está incluso detrás de los montones de Fibonacci, un tipo de estructura de datos que se utiliza para acelerar ciertas operaciones, como encontrar el camino más corto en una red.
Aquí tienes un ejemplo sencillo de cómo puedes generar una secuencia de Fibonacci en Python:
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
# Example usage
for i in range(10):
print(fibonacci(i), end=" ")
0 1 1 2 3 5 8 13 21 34
Esta función recursiva muestra cómo se construye la secuencia de Fibonacci. Aunque la recursividad es fácil de entender, también existen versiones optimizadas, como la programación dinámica, para calcular los números de Fibonacci mucho más rápido.
En criptografía, los números de Fibonacci pueden ayudar a generar claves seguras. Y en inteligencia artificial, optimizan las redes neuronales para mejorar el modo en que los algoritmos aprenden y se adaptan.
Otros ejemplos comunes
He aquí algunos ejemplos más de cómo aparece esta secuencia en la vida cotidiana y en campos especializados:
- En el Art: La secuencia de Fibonacci ha sido utilizada por artistas y arquitectos durante siglos. Estructuras famosas como el Partenón presentan estas proporciones porque son naturalmente agradables a la vista.
- En Música: Los compositores utilizan los números de Fibonacci para crear ritmos y melodías. Por ejemplo, asignan notas enteras a 1, medias notas a 2 y negras a 3 para crear patrones armónicos.
- En Comercio: Los operadores bursátiles aplican los números de Fibonacci para analizar las tendencias del mercado. Los utilizan para predecir posibles niveles de precios en los que las acciones podrían invertirse, ayudándoles a decidir cuándo comprar o vender.
- En Física: En física cuántica, se han observado patrones de Fibonacci en las interacciones y el comportamiento de las partículas, revelando cómo estas secuencias aparecen incluso en las escalas más pequeñas de la naturaleza.
Implementación de la Secuencia de Fibonacci en Python
Dado que Python proporciona varias formas de generar la secuencia de Fibonacci, he comentado las más utilizadas paso a paso con ejemplos.
Utilizando un método iterativo
El método iterativo es una de las formas más sencillas de generar la secuencia de Fibonacci. Utiliza un bucle para calcular cada término de la secuencia, lo que lo hace más eficiente en memoria que los métodos recursivos. Funciona así:
Establecí dos variables, a
y b
, en 0
y 1
. Representan los dos primeros números de la secuencia. Después, utilizo un bucle for
para calcular los siguientes números. Actualizo a
para que mantenga el valor de b
, y b
se convierte en la suma de las anteriores a
y b
.
Aquí tienes un código Python para ello:
n = 10
a, b = 0, 1
for i in range(n):
print(a)
a, b = b, a + b
0
1
1
2
3
5
8
13
21
34
Si quieres utilizar un bucle while
en lugar de un bucle for
, así es como puedes escribir el código:
# Number of terms to print in the Fibonacci series
n = 10
# Initialize the first two terms
a, b = 0, 1
i = 0
while i < n:
print(a, end=' ')
# Update the terms
a, b = b, a + b
i += 1
0 1 1 2 3 5 8 13 21 34
Ambos métodos son muy fáciles de entender, lo que los hace perfectos para principiantes.
Utilizar un método recursivo
El método recursivo es otra forma de generar números de Fibonacci. No es tan rápido como el método iterativo para secuencias más grandes, pero es una forma estupenda de entender la lógica que hay detrás de cómo se construye la secuencia.
Por ejemplo, creo una función llamada fibonacci_recursive
. Esta función toma como entrada un número n
. Si n
es 0
o 1
, la función devuelve n
. Son los casos base que indican a la recursividad cuándo debe detenerse. Para cualquier otro número, la función se llama a sí misma para calcular los dos números anteriores y los suma.
Aquí tienes el código para ello:
def fibonacci_recursive(n):
if n <= 1:
return n
else:
return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)
num_terms = 10
for i in range(num_terms):
print(fibonacci_recursive(i), end=" ")
0 1 1 2 3 5 8 13 21 34
Este método funciona bien para secuencias pequeñas, pero puede volverse lento a medida que la secuencia crece, porque recalcula los mismos valores varias veces.
Utilizar un método recursivo optimizado con almacenamiento en caché
Para solucionar la ineficacia de la recursividad simple, suelo utilizar la caché. La página lru_cache
de Python almacena los valores calculados previamente para que la función no tenga que rehacer el trabajo.
Así es como lo hago:
from functools import lru_cache
@lru_cache(maxsize = None)
def fib_cache(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib_cache(n-1) + fib_cache(n-2)
print(f"The Fibonacci Number is {fib_cache(10)}")
The Fibonacci Number is 55.
Este enfoque combina la claridad de la recursividad con la eficacia del almacenamiento en caché.
Formas más avanzadas de hacer la Secuencia de Fibonacci en Python
Si buscas otras formas de calcular los números de Fibonacci, aquí tienes algunas técnicas más avanzadas:
Exponenciación de matrices
La exponenciación matricial es una de las formas más eficaces de calcular los números de Fibonacci para valores grandes de n
. En lugar de recalcular los términos repetidamente, este método utiliza la multiplicación de matrices para obtener resultados en tiempo logarítmico.
He aquí cómo lo he implementado en Python:
import numpy as np
def fibonacci_matrix(n):
def matrix_power(matrix, power):
return np.linalg.matrix_power(matrix, power)
if n == 0:
return 0
matrix = np.array([[1, 1], [1, 0]])
result = matrix_power(matrix, n-1)
return result[0][0]
for i in range(10):
print(fibonacci_matrix(i) , end=" ")
0 1 1 2 3 5 8 13 21 34
En este código, si n
es 0
, devuelve 0
como caso base. Para otros valores, la matriz se eleva a la potencia (n-1)
utilizando la función matrix_power
de numpy. El número de Fibonacci en la posición n
se encuentra en el elemento superior izquierdo de la matriz resultante.
Fórmula de Binet
La fórmula de Binet calcula directamente el número de Fibonacci nth
sin iteración ni recursividad. Se basa en la proporción áurea, φ
, y utiliza una expresión matemática para calcular el resultado al instante.
La fórmula es:
Dónde:
- φ = (1 + √5) / 2la proporción áurea.
- 1 - φ es el conjugado de φ.
Aquí tienes el código Python de la fórmula de Binet:
import math
def fibonacci_binet(n):
phi = (1 + math.sqrt(5)) / 2
return round((phi ** n - (1 - phi) ** n) / math.sqrt(5))
# Find the 10th Fibonacci number
n = 10
result = fibonacci_binet(n)
print(f" The Fibonacci Number of {n}th term is {result}" )
The Fibonacci number of 10th term is 55
En este código, la función fibonacci_binet(n)
calcula el número nth
de Fibonacci utilizando la fórmula de Binet. Dentro de la función, calculo phi (la proporción áurea) como (1 + math.sqrt(5)) / 2
, utilizando math.sqrt()
para la raíz cuadrada de 5. A continuación se aplica la fórmula (phi ** n - (1 - phi) ** n) / math.sqrt(5)
para hallar directamente el número de Fibonacci nth
. A continuación, utilizo la función round()
para tratar cualquier pequeña imprecisión en coma flotante.
Matrices
Incluso puedes utilizar matrices para generar y almacenar toda la secuencia de Fibonacci. Esto es útil cuando necesitas varios términos simultáneamente.
Aquí tienes el código para ello:
def fibonacci(n):
if n <= 0:
return "Incorrect Output"
data = [0, 1] # Initialize list with first two Fibonacci terms: 0 and 1
if n > 2:
for i in range(2, n): # Start loop from the third term
data.append(data[i-1] + data[i-2]) # Calculate next term as sum of previous two
return data[n-1] # Return the nth term
print(f"Fibonacci Number: {fibonacci(10)}")
Fibonacci number: 34
Retroceder
El backtracking es otra opción que podría utilizar, sobre todo cuando quiero combinar la recursividad con la memoización para mejorar el rendimiento.
Aquí tienes el código para ello:
def fibonacci_backtracking(n, computed ={0: 0, 1: 1}):
if n in computed:
return computed[n]
computed[n] = fibonacci_backtracking(n - 1) + fibonacci_backtracking(n - 2)
return computed[n]
n = 10
result = fibonacci_backtracking(n)
print(f"The {n}th Fibonacci term is {result}")
The 10th Fibonacci term is 55
Complejidad de los Algoritmos Fibonacci en Python
¡Hemos pasado por bastantes ejemplos! Veamos ahora sus diferencias en términos de complejidad temporal y espacial. Como hemos dicho, algunos métodos de son rápidos pero utilizan más memoria, mientras que otros son más lentos pero necesitan menos espacio. He preparado esta tabla para comparar la eficacia de cada enfoque.
Método | Complejidad temporal | Complejidad espacial |
---|---|---|
Iterativo (bucle For) | O(n) | O(1) |
Iterativo (bucle While) | O(n) | O(1) |
Recursión simple | O(2ⁿ) | O(n) |
Memoización/Caching | O(n) | O(n) |
Basado en matrices | O(n) | O(n) |
Método de retroceso | O(2ⁿ) | O(2ⁿ) |
Exponenciación de matrices | O(log n) | O(log n) |
En la tabla anterior, he aquí lo que significa cada complejidad temporal y espacial:
-
O(n): El algoritmo itera a través de la secuencia una vez realizando un número fijo de operaciones para cada elemento. El tiempo que tarda crece linealmente con el tamaño de la entrada
n
. -
O(1): El número de Fibonacci se calcula mediante un número fijo de operaciones, sin iteración ni recursión.
-
O(2n): El algoritmo realiza dos llamadas recursivas para cada entrada, lo que provoca un crecimiento exponencial del número de llamadas a funciones a medida que aumenta
n
. -
O(log n): El tiempo de ejecución crece en proporción al logaritmo del tamaño de la entrada
n
.
-
O(n): El algoritmo utiliza una memoria que crece directamente con el número de entradas
n
. Aquí, cada elemento requiere una cantidad fija de espacio. -
O(1): El uso de memoria permanece constante independientemente del tamaño de la entrada.
-
O(2n): Utiliza un espacio exponencial debido a la creación de nuevos estados para cada rama.
-
O(log n): Las multiplicaciones de matrices intermedias utilizan memoria logarítmica.
Reflexiones finales
Como has visto, en Python puedes calcular los números de Fibonacci utilizando muchos métodos diferentes, desde sencillos bucles hasta técnicas avanzadas como la exponenciación matricial y la fórmula de Binet. Cada método tiene sus ventajas e inconvenientes.
Espero que hayas aprendido algo tanto sobre la secuencia de Fibonacci como sobre la programación en Python. Si quieres saber más sobre Python y temas relacionados, consulta nuestro curso Introducción a Python. También puedes probar nuestra carrera completa de Desarrollador Python y aprender técnicas de programación, ¡e incluso empezar a desarrollar tus propios paquetes!
Soy una estratega de contenidos a la que le encanta simplificar temas complejos. He ayudado a empresas como Splunk, Hackernoon y Tiiny Host a crear contenidos atractivos e informativos para su público.
Preguntas frecuentes sobre la Secuencia de Fibonacci en Python
¿Para qué sirve la secuencia de Fibonacci?
La secuencia de Fibonacci se utiliza en diversos campos, como las matemáticas, la informática y el estudio de la naturaleza, para modelar patrones de crecimiento y optimizar algoritmos.
¿Cómo se calcula la secuencia de Fibonacci?
La sucesión de Fibonacci se calcula sumando los dos números anteriores para obtener el número siguiente, empezando por 0 y 1.
¿Cuáles son los ejemplos de la secuencia de Fibonacci en la naturaleza?
Algunos ejemplos son la disposición de las hojas en un tallo, la ramificación de los árboles y el patrón de diversos frutos y flores.
¿Cómo se implementa la secuencia de Fibonacci en Python?
Puedes implementarlo utilizando un enfoque iterativo o recursivo, con ejemplos de código Python disponibles en muchos tutoriales de programación.
¿Cuál es la fórmula del enésimo término de la sucesión de Fibonacci?
El enésimo término puede calcularse mediante la fórmula de Binet, que utiliza la proporción áurea y proporciona un método de cálculo directo.
Aprende Python con DataCamp
curso
Intermediate Object-Oriented Programming in Python
curso
Python Toolbox

blog
Cómo aprender Python desde cero en 2024: Guía del experto
tutorial
Tutorial de funciones de Python
tutorial
Tutorial de bucles For en Python
tutorial
Búsqueda binaria en Python: guía completa para una búsqueda eficiente
tutorial
Tutorial de cadenas en Python
tutorial
Matrices en Python

DataCamp Team
3 min