Saltar al contenido principal

Secuencia de Fibonacci en Python: Aprende y explora técnicas de codificación

Descubre cómo funciona la secuencia de Fibonacci. Explora sus propiedades matemáticas y sus aplicaciones en el mundo real.
Actualizado 17 ene 2025  · 6 min de lectura

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

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:

La fórmula de Binet en la secuencia de Fibonacci en python.

Dónde:

  • φ = (1 + 5) / 2​la 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:

Complejidad temporal

  • 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.

Complejidad espacial

  • 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!


Laiba Siddiqui's photo
Author
Laiba Siddiqui
LinkedIn
Twitter

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.

Temas

Aprende Python con DataCamp

curso

Introduction to Python

4 hr
6M
Master the basics of data analysis with Python in just four hours. This online course will introduce the Python interface and explore popular packages.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

blog

Cómo aprender Python desde cero en 2024: Guía del experto

Descubre cómo aprender Python, sus aplicaciones y la demanda de conocimientos de Python. Comienza hoy tu andadura en Python ​con nuestra guía completa.
Matt Crabtree's photo

Matt Crabtree

19 min

tutorial

Tutorial de funciones de Python

Un tutorial sobre funciones en Python que cubre cómo escribir funciones, cómo invocarlas y mucho más.
Karlijn Willems's photo

Karlijn Willems

14 min

tutorial

Tutorial de bucles For en Python

Aprenda a implementar bucles For en Python para iterar una secuencia, o las filas y columnas de un dataframe pandas.
Aditya Sharma's photo

Aditya Sharma

5 min

tutorial

Búsqueda binaria en Python: guía completa para una búsqueda eficiente

Aprende a implementar la búsqueda binaria en Python utilizando enfoques iterativos y recursivos, y explora el módulo bisect integrado para obtener funciones de búsqueda binaria eficientes y preimplementadas.
Amberle McKee's photo

Amberle McKee

12 min

tutorial

Tutorial de cadenas en Python

En este tutorial, aprenderás todo sobre las cadenas de Python: trocearlas y encadenarlas, manipularlas y darles formato con la clase Formatter, cadenas f, plantillas y ¡mucho más!
Sejal Jaiswal's photo

Sejal Jaiswal

16 min

tutorial

Matrices en Python

Matrices en Python con ejemplos de código. Aprende a crear e imprimir matrices con Python NumPy hoy mismo.
DataCamp Team's photo

DataCamp Team

3 min

Ver másVer más