Introducción
Viajemos en el tiempo hasta la Italia del siglo XIII para conocer al hombre detrás de esta maravilla matemática: Leonardo de Pisa, más conocido como Fibonacci. Leonardo fue un matemático brillante de la Edad Media. Su obra más famosa, el Liber Abaci, introdujo en Europa el sistema de numeración indo-arábigo (9,8,7,6,5,4,3,2,1), el que utilizamos hoy en día, reemplazando al engorroso sistema romano. En este libro Fibonacci planteo un problema sobre la reproducción de los conejos:
El problema
- Imagina que tienes una pareja de conejos recién nacidos, macho y hembra.
- Los conejos pueden aparearse al mes de edad.
- Después de un mes de gestación, la hembra da a luz a otra pareja de conejos, también macho y hembra.
- Supón que los conejos nunca mueren.
¿Cuántas parejas habrá después de un año?
La solución
Resolviendo este problema, Fibonacci descubrió una secuencia numérica:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
La lógica en esta secuencia es que cada número después de los dos primeros es la suma de los dos números precedentes:
- 0 + 1 = 1
- 1 + 1 = 2
- 1 + 2 = 3
- 2 + 3 = 5
- 5 + 3 = 8
- Y así sucesivamente
Aunque el planteamiento hablaba sobre conejos, se descubrió que esta sucesión era un patrón fundamental en la naturaleza y las matemáticas.
Por ejemplo, hay patrones en la naturaleza que son mas o menos fieles a esta sucesión de números, como son las semillas de girasol, la espiral de una concha de caracol, la ramificación de los árboles, incluso el número áureo ya que si divides cualquier número de la sucesión de Fibonacci por el número que le precede (por ejemplo, 8/5 = 1.6, 13/8 = 1.625, 21/13 ≈ 1.615) a medida que avanzas en la secuencia el resultado se parece mas al número áureo el cual es un número irracional cuya representación decimal es infinita y no tiene periodo, llamado también el número de oro o el numero De Dios. En informática la sucesión de Fibonacci aparece en diversos algoritmos y estructuras de datos, como la búsqueda binaria, la generación de números pseudoaleatorios y ciertas estructuras de datos llamadas montículos de Fibonacci.
¿Y Python?
Ya hemos llegado a lo que nos interesa, como generar la secuencia de Fibonacci con Python. Vamos a hacer primero una función que nos muestre una cantidad de números de la secuencia determinada comenzando por el primero. Para ello escribimos este script:
def generar_fibonacci(n):
"""
Genera los primeros n números de la sucesión de Fibonacci.
"""
if n <= 0:
return
elif n == 1:
return [0]
else:
lista_fib = [0, 1]
while len(lista_fib) < n:
siguiente_fib = lista_fib[-1] + lista_fib[-2]
lista_fib.append(siguiente_fib)
return lista_fib
# Generar los números de Fibonacci
cantidad = 10
secuencia_fibonacci = generar_fibonacci(cantidad)
# Imprimir la secuencia
print(f"Los primeros {cantidad} números de la secuencia de Fibonacci son:")
for numero in secuencia_fibonacci:
print(numero, end=", ")
La función generar_bibonacci(n) recibe el parámetro n que indica la cantidad de números de la sucesión que se van a generar. La primera comprobación es obligada ya que si la cantidad es 0 o inferior no habrá sucesión y si solo fuera un elemento este sería el 0. Sin embargo si hemos pasado un número superior, usando una lista con dos valores y comenzando con 0,1 lista_fib = [0, 1] iremos añadiendo elementos a la lista con lista_fib.append(siguiente_fib) hasta que nuestra lista mida lo mismo que el parámetro pasado while len(lista_fib) < n: y esos números serán la suma del último valor de la lista mas el anterior (siguiente_fib = lista_fib[-1] + lista_fib[-2])
Volviendo al problema de los conejos
def problema_conejos_fibonacci(meses):
"""
Calcula el número de parejas de conejos después de un número dado de meses,
siguiendo el problema original de Fibonacci.
"""
if meses <= 0:
return 0
elif meses == 1:
return 1
else:
a, b = 1, 1 # Inicializamos con la pareja del primer mes y la pareja madura del segundo mes
for _ in range(2, meses):
nueva_pareja = a + b
a, b = b, nueva_pareja
return b
# Calcular el número de parejas después de 12 meses (un año)
meses_transcurridos = 12
parejas_finales = problema_conejos_fibonacci(meses_transcurridos)
# Imprimir el resultado
print(f"Después de {meses_transcurridos} meses, habrá {parejas_finales} parejas de conejos.")
Para resolver el problema de los conejos usamos una función un poco diferente ya que el problema decía que habían dos conejos, por tanto no podemos comenzar la secuencia con 0 y 1, sino mas bien con 1 y 1, además lo que queremos no es la secuencia en sí sino el número que se obtiene después de seguir la secuencia después de un año, es decir 12 meses.
En este caso hacemos un bucle para ir asignado durante cada mes los valores, es decir el primer mes a vale 1 y b vale 1, el segundo mes sumamos a+b e intercambiamos los valores, es decir a=b y b=suma de a+b, el siguiente mes volvemos a hacer lo mismo y siempre tendremos en b el valor total de conejos.
Espero que os haya gustado, si es así comentad.