jueves, 7 de diciembre de 2017

Sobre la sucesión de Fibonacci y su programación



Leonardo de Pisa (1180-1240), no sabía que uno de los problemas contenidos en su libro Liber Abaci lo haría inmortal.
Este problema trata sobre la reproducción de conejos :



¿Cuántas parejas de conejos tendremos a fin de año, si comenzamos con una pareja que produce cada mes otra pareja que procrea a su vez a los dos meses de vida?

La respuesta queda como sigue:

  • El primer mes , tenemos una pareja de conejos.
  • El segundo mes, la pareja envejece (todavía no procrea)
  • El tercer mes, la pareja procrea otra pareja, o sea que ya tenemos dos.
  • El cuarto mes, la pareja más vieja vuelve a procrear, mientras que la segunda envejece. En total, tenemos 3 parejas.
  • El quinto mes, las dos parejas más viejas procrean de nuevo, y la tercera envejece. En total, tenemos 3+2=5
  • El sexto mes, las tres parejas más viejas procrean, y las dos más nuevas envejecen, de manera que tenemos 5+3 = 8.
  • Y así sucesivamente ....
 Los 20 primeros términos de la sucesión son:.

{1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765}

en algunos textos la serie se inicia con el 0, pero si el criterio es que un término es suma de los dos anteriores, con el 0 como inicio poco podemos avanzar.

A la hora de realizar un programa para calcular los términos de la serie, lo podemos efocar de varias maneras, vamos a ver dos de ellas:

  • Método directo aplicando la generación de términos
  • Mediante métodos recursivos
  • Mediante métodos iterativos


En Python  el primer método quedaría:



def fibonacci(n):
    a, b = 1,1
    for i in range(1,n+1):
        print(i, a, end=' ')
        a, b = b, a+b
        print()

n_t = int(input("Introduce el número de términos "))
print ('Los {0} primeros términos de la serie de Fibonaccci'.format(n_t))
fibonacci(n_t)

En este caso introducimos el número de términos de la serie que queremos

Para el segundo caso, el recursivo, también en Python, quedaría:

def fibonacci(n):
    if n==1 or n==2:
        resultado=1
    elif n>2:
        resultado=fibonacci(n-1)+fibonacci(n-2)
    return resultado

n_t = int(input("Introduce el valor de termino "))

for i in range(1, n_t + 1):
    print('El {0} término de la serie de Fibonaccci es {1}'.format(i,fibonacci(i)))



Y por último mediante métodos iterativos, es decir mediante un fórmula, que nos de el valor del término que estamos buscando, en este caso usaremos la deducida por Edouard Lucas.


def fibonacci(n):
    resultado=(((1+5**0.5)/2)**n-((1-5**0.5)/2)**n)/5**0.5
    return resultado

n_t = int(input("Introduce el valor de termino "))

for i in range(1, n_t + 1):
    print('El {0} término de la serie de Fibonaccci es {1}'.format(i,int(fibonacci(i))))

También podemos usar las funciones de los programas de cálculo numerico o simbólico existentes:
En Mathematica podemos usar la expresión :

Table[Fibonacci[n], {n, 20}] Para obtener los 20 primeros elementos de la sucesión

Si queremos usar la expresión de Lucas, lo podemos implementar así:

F[n_] = (((1 + Sqrt[5])/2)^n - ((1 - Sqrt[5])/2)^n)/Sqrt[5];
N[Table[F[n], {n, 20}]]


continuamos sumando conejos....

No hay comentarios:

Publicar un comentario