Sucesión de Fibonacci con Python

La Sucesión de Fibonacci es una sucesión de números enteros iniciando con dos números base, 0 y 1. Cada número de la sucesión es el resultado de la suma de los dos anteriores; por ejemplo:

[0] [1] [1] [2] [3] [5] [8] [13] [21] [34]

Esta Sucesión de Fibonacci solo muestra 10 números y se observa cómo se genera cada número sumando los dos números anteriores, es decir: 0 + 1 = 1, 1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5… hasta 13 + 21 = 34…

Código fuente:

El programa que nos permite generar la Sucesión de Fibonacci en Python es muy sencillo y tan solo ocupa un total de 18 líneas de código, es interactivo ya que le permite al usuario el límite de números de la sucesión.

aux, fib, init = 1, 0, 1

_INFO = """Este programa imprime la sucesion de fibonacci desde 1 hasta N, 
siendo este ultimo un numero ingresado por el usuario
"""

print(_INFO)
lim = int(input("Ingrese un numero para la sucesion de fibonacci: "))

if lim > 0:
    while init <= lim:
        print("[{0}]".format(fib), end=" ")
        aux += fib 
        fib = aux - fib
        init += 1
    print()
else:
    print("El numero debe ser mayor a cero!!")
Asignación múltiple:
aux, fib, init = 1, 0, 1

En este fragmento de código se realiza la declaración de 3 variables con asignación múltiple, en Python esto es posible siempre y cuando se cumpla con una sola regla, debe existir un número de valores igual al número de variables y viceversa. Aquí se declaran las variables aux, fib e init que se inicializan con los valores 1, 0 y 1, respectivamente. La asignación se hace en el mismo orden en el que se encuentran las variables.

Cadena de caracteres multilínea:
_INFO = """Este programa imprime la sucesion de fibonacci desde 1 hasta N, 
siendo este ultimo un numero ingresado por el usuario
"""

En Python no existe una palabra clave const o val para definir constantes como si los hay en otros lenguajes, por tal motivo la variable _INFO viene con un guión bajo para simular una constante; mientras que para crear strings multilínea, el texto se encierra entre comillas dobles “”” o comillas simples ”’. En este fragmento de código se crea una variable con un mensaje multilínea que se mostrará al usuario.

Mostrando información y solicitando datos, función input():
print(_INFO)
lim = int(input("Ingrese un numero para la sucesion de fibonacci: "))

En primera línea de este fragmento de código se muestra al usuario la información almacenada en la variable _INFO, la función print() en Python es la encargada de imprimir información en consola. En la segunda línea se lee la información ingresada por el usuario, pero hay un orden, es decir, primero se lee el dato ingresado por el usuario usando la función input() la cual contiene un string informativo; por último se convierte el dato ingresado a número entero usando la función int() ya que todo dato leído por input() se lee como un string.

Sentencia if y proceso interno:
if lim > 0:
    while init <= lim:
        print("[{0}]".format(fib), end=" ")
        aux += fib 
        fib = aux - fib
        init += 1
    print()
else:
    print("El numero debe ser mayor a cero!!")

Debido a que la cantidad de números de la Sucesión de Fibonacci a mostrar van en un rango desde 1 hasta N, es decir, si queremos mostrar los 10 primeros números de la sucesión como se hizo al inicio, necesitaremos un bucle que vaya desde 1 hasta N; por lo tanto se necesita que una sentencia if verifique que N sea mayor a 0, garantizando el correcto procesamiento de la información sólo si se cumple dicha condición.

Recorriendo el rango con while:

El bucle while va a iterar mientras que la variable init sea menor o igual a lim, siendo este último el rango máximo de números que serán mostrados, mientras que en su interior hay una función print() que imprime cada número Fibonacci encerrado entre [..]; en Python los strings son objetos y como tal, poseen métodos tal como .format() que nos permite formatear los strings tomando cada valor pasado al método para reemplazar cada juego de {0} (con un índice opcional) por dicho valor en el mismo orden en el que están en el método.

while init <= lim:
    print("[{0}]".format(fib), end=" ")
    aux += fib 
    fib = aux - fib
    init += 1
print()

Hay dos operaciones básicas, la primera corresponde a la suma abreviada de aux += fib en la línea #4 que es equivalente a escribir aux = aux + fib el cual suma el valor en aux y fib, y luego lo asigna a aux pero ambas formas son válidas; la segunda, en la línea #4, es una resta entre aux y fib sin abreviación ya que aux siempre será mayor que fib. Por último aparece la variable init que se incrementa en +1 en cada iteración.

La sentencia else solo emite un mensaje en caso de que el número ingresado es cero o menos a cero.

¿Como funciona internamente las operaciones aritméticas?:

Como se describe arriba, hay dos operaciones aritméticas básicas, la primera es una suma y la segunda es una resta; pero, ¿cómo funcionan tras bambalinas? Aquí veremos lo que ocurre con cada operación.

Primera operación aritmética, aux += fibo aux = aux + fib:

Para ilustrar lo que ocurre con esta primera operación aritmética, he modificado el código para imprimir una tabla que nos muestre con mayor detalles los cambios en las variables con cada iteración.

Ingrese un numero para la sucesion de fibonacci: 10
|	Valores iniciales	| = |	nuevo valor de Aux	|
|	Fib		Aux	|   |	     aux += fib		|
|	[0]	+	[1]	| = |		[1]		|
|	[1]	+	[1]	| = |		[2]		|
|	[1]	+	[2]	| = |		[3]		|
|	[2]	+	[3]	| = |		[5]		|
|	[3]	+	[5]	| = |		[8]		|
|	[5]	+	[8]	| = |		[13]		|
|	[8]	+	[13]	| = |		[21]		|
|	[13]	+	[21]	| = |		[34]		|
|	[21]	+	[34]	| = |		[55]		|
|	[34]	+	[55]	| = |		[89]		|

Al inicio de esta publicación se dijo que la serie inicia con 2 números base, 0 y 1. Al lado izquierdo de la tabla se muestra que Fib tiene como valor inicial 0 mientras que Aux tiene como valor inicial 1; al lado derecho se muestra cada cambio en el valor de la variable Aux después de la suma hecha en cada iteración.

Segunda operacion aritmetica, fib = aux - fib:

Para ilustrar lo que ocurre con esta segunda operación aritmética, he modificado nuevamente el código para imprimir una tabla que nos muestre con mayor detalles los cambios en las variables con cada iteración.

Ingrese un numero para la sucesion de fibonacci: 10 
|	  fib = aux - fib	| = |  Resultado de la Sucesion	|
|	Aux		Fib	|   |	   Numero Fibonacci	|
|	[1]	-	[1]	| = |		[0]		|
|	[2]	-	[1]	| = |		[1]		|
|	[3]	-	[2]	| = |		[1]		|
|	[5]	-	[3]	| = |		[2]		|
|	[8]	-	[5]	| = |		[3]		|
|	[13]	-	[8]	| = |		[5]		|
|	[21]	-	[13]	| = |		[8]		|
|	[34]	-	[21]	| = |		[13]		|
|	[55]	-	[34]	| = |		[21]		|
|	[89]	-	[55]	| = |		[34]		|

Con la anterior operación aritmética se altera el valor de la variable aux, se dijo que este valor es mayor que el valor de fib y la tabla nos muestra que efectivamente si es así; excepto en los primeros valores cuyo valor es igual. Al realizar la resta entre aux y fib nos da como resultado el valor del número Fibonacci; este resultado coincide con el valor de la variable fib en la tabla de la anterior operación.

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *