Sucesión de Fibonacci en Python

Para este ejercicio de programación vamos a hacer un programa que calcule la Sucesión de Fibonacci en Python, el cual tomamos de los ejercicios propuestos en:

Libro: Intro to Python® for Computer Science and Data Science
Autor: Paul Deitel / Harvey Deitel

El cual se encuentra en el libro de la siguiente manera:

3.15 (Challenge: Fibonacci Sequence) In the Fibonacci sequence, each number is the sum of the two preceding ones. The first 10 Fibonacci numbers are as follows:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

Write a script where a user inputs a position (a number) and the number in that position
in the Fibonacci Sequence is displayed.

La sucesión de Fibonacci es una secuencia de números donde cada número es la suma de los dos anteriores. Esta secuencia es muy interesante a nivel matemático ya que aparece en muchos elementos de la naturaleza.

El problema que nos plantean es hacer un programa donde se introduzca un número entero, y nos devuelva el valor de la sucesión de Fibonacci en esa posición, tomando los primeros 10 números de Fibonacci mencionados arriba, si damos la posición 5 debería devolver el valor 3, o en la posición 10 el valor 34, etc.

Algoritmo

Como en cualquier ejercicio de programación necesitamos un algoritmo, el cual lo podemos determinar nosotros o puede ser proporcionado por otro medio, en nuestro caso vamos a usar uno de los muchos algoritmos que se mencionan en la página de wikipedia sobre la sucesión de Fibonacci:

Sucesión de Fibonacci

Este algoritmo se ajusta a nuestro problema, ya que:

  • Define los valores iniciales de la serie que son 0 y 1
  • Define n, que es la posición hasta la cual debemos calcular
  • y regresa el valor del último elemento de la serie, que sería el ultimo elemento de la sucesión de Fibonacci

Código

Primero, debemos obtener la posición hasta la cual se va a calcular la serie, y debemos inicializar los dos valores inicial (a) y final (b) del algoritmo.

pos = int(input('Escriba que posición quiere de la serie de Fibonacci: '))
iniFibo = 0
finFibo = 1

y ahora debemos crear el ciclo donde vamos a calcular desde 0 hasta la posición que se solicito anteriormente, de acuerdo al algoritmo queda así:

for x in range(0,pos):
    finFibo = finFibo + iniFibo
    iniFibo = finFibo - iniFibo
print(f'\nPosición Final: {x+1:>4} -- Valor en la serie de Fibonacci:  {sum:>10}  ')

Pero hay un problema, los valores de la sucesión de Fibonacci aparecen desplazados dos lugares, por ejemplo, si pido la posición 8 debería devolver el valor 13, pero devuelve el valor 34 que es la posición 10.

Esto se debe a que el valor de la serie debe comenzar en 0, pero definimos el valor b como 1, y este es el valor en la posición 3 de la serie. Para solucionarlo simplemente debemos poner un condicional al valor de la posición durante el ciclo, evaluando si es la posición 0 o la 1, que son las dos posiciones «perdidas», quedando así el condicional:

for x in range(0,pos):
    if x == 0:
        finFibo = 0
    elif x == 1:
        finFibo = 1
    finFibo = finFibo + iniFibo
    iniFibo = finFibo - iniFibo
print(f'\nPosición Final: {x+1:>4} -- Valor en la serie de Fibonacci:  {finFibo:>10}  ')

Y ahora obtenemos otro efecto indeseado, ya que el valor final de incrementa en el ultimo ciclo, y por lo tanto se adelanta una posición, ahora para la posición 10 devuelve 55, es es el valor de la posición 11 en la serie. La solución a esto es crear una variable que almacene el valor final antes de actualizarlo, solo agregamos otra linea de código en el ciclo y hacemos que se imprima en el resultado:

pos = int(input('Escriba que posición quiere de la serie de Fibonacci: '))
iniFibo = 0
finFibo = 1
for x in range(0,pos):
    if x == 0:
        finFibo = 0
    elif x == 1:
        finFibo = 1
    sum = finFibo
    finFibo = finFibo + iniFibo
    iniFibo = finFibo - iniFibo
print(f'\nPosición Final: {x+1:>4} -- Valor en la serie de Fibonacci:  {sum:>10}  ')

y con esto ya tenemos listo el programa que nos devuelve el valor del elemento de la serie de Fibonacci en la posición que ingresamos, por ejemplo si recordamos que los primero 10 elementos de Fibonacci son:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

ejecutamos para la posición 3, 5 y 10 como ejemplo:

Escriba que posición quiere de la serie de Fibonacci: 3

Posición Final:    3 -- Valor en la serie de Fibonacci:           1

Escriba que posición quiere de la serie de Fibonacci: 5

Posición Final:    5 -- Valor en la serie de Fibonacci:           3

Escriba que posición quiere de la serie de Fibonacci: 10

Posición Final:   10 -- Valor en la serie de Fibonacci:          34

Y vemos que nos devuelve los valores correctos de acuerdo a la posición dada.

Extra

Podemos también mostrar cada uno de los términos de la serie de Fibonacci simplemente para ver toda la serie, incluso vamos a darle un poco más de interactividad preguntando al usuario si desea ver el desarrollo de la serie, si responde que si, agregamos un condicional en el ciclo for, para mostrar la posición y el valor de la serie durante cada iteración, quedando el código completo de la siguiente forma:

# Solicitamos la posición de la serie hasta la que debemos calcular
pos = int(input('Escriba que posición quiere de la serie de Fibonacci: '))
# Preguntamos si se desea desarrollar la serie
ans = input('Desea ver el resultado de toda la serie? ( S/N ) : ')
# Inicializamos las variables
iniFibo = 0
finFibo = 1
# Comenzamos el ciclo de calculo de Fibonacci hasta la posición indicada
for x in range(0,pos):
    # Evaluamos las dos primeras posiciones de la serie
    if x == 0:
        finFibo = 0
    elif x == 1:
        finFibo = 1
    # Si acepto desarrollar la serie se imprime la posición y el valor correspondiente
    # La posicion se le suma 1 ya que el rango comienza en 0 y no en 1
    if ans =='S' or ans == 's' :
         print(f'Posicion: {x+1:>4} -- Valor en la serie de Fibonacci:  {finFibo:>10}  ')
    # Guardamos el valor final de la seria antes de actualizarlo
    sum = finFibo
    # Actualizamos los valores de acuerdo al algoritmo
    finFibo = finFibo + iniFibo
    iniFibo = finFibo - iniFibo
# Imprime el valor final de la serie, independientemente si se desarrollo la serie o no
print(f'\nPosición Final: {x+1:>4} -- Valor en la serie de Fibonacci:  {sum:>10}  ')

Al ejecutarlo nos pregunta la posición a calcular y si deseamos que se desarrolle, el resultado para la posición 15 sin y con desarrollo es el siguiente

Escriba que posición quiere de la serie de Fibonacci: 15
Desea ver el resultado de toda la serie? ( S/N ) : n

Posición Final:   15 -- Valor en la serie de Fibonacci:         377

Escriba que posición quiere de la serie de Fibonacci: 15
Desea ver el resultado de toda la serie? ( S/N ) : s
Posicion:    1 -- Valor en la serie de Fibonacci:           0  
Posicion:    2 -- Valor en la serie de Fibonacci:           1
Posicion:    3 -- Valor en la serie de Fibonacci:           1
Posicion:    4 -- Valor en la serie de Fibonacci:           2
Posicion:    5 -- Valor en la serie de Fibonacci:           3
Posicion:    6 -- Valor en la serie de Fibonacci:           5
Posicion:    7 -- Valor en la serie de Fibonacci:           8
Posicion:    8 -- Valor en la serie de Fibonacci:          13
Posicion:    9 -- Valor en la serie de Fibonacci:          21
Posicion:   10 -- Valor en la serie de Fibonacci:          34
Posicion:   11 -- Valor en la serie de Fibonacci:          55
Posicion:   12 -- Valor en la serie de Fibonacci:          89
Posicion:   13 -- Valor en la serie de Fibonacci:         144
Posicion:   14 -- Valor en la serie de Fibonacci:         233
Posicion:   15 -- Valor en la serie de Fibonacci:         377

Posición Final:   15 -- Valor en la serie de Fibonacci:         377

Y vemos que los 10 primeras posiciones corresponden a la serie mostrada al principio, con lo cual comprobamos que el programa funciona, obviamente para mejorarlo deberíamos agregar condicionales para evitar errores al meter un valor no válido en la posición a calcular, pero eso ya se los dejo de tarea.

Recuerden, si desean optimizarlo, mejorarlo, corregirlo, etc. háganlo y compartan el resultado en los comentarios o en nuestra página de Facebook.

Otros ejercicios de programación que podrían interesarte:

Te puede interesar: