Vamos a programar #90 - La sucesión de Fibonacci y la función de Ackerman (ver. Python)
Hola de nuevo a toos, el dia de hoy vamos a ver un poco de Python. En días anteriores, mientras revisaba algunos comentarios en twitter, aalgunas personas me preguntaron sobre el estado del blog, pese al que el estado actual ha empeorado un poco debido a cierto bicho, el hecho fue que un par de "accidentes" me impidieron crear nuevos post. Pero dejando eso de lado, mucha gente pidio que si les podia ayudar con python (si hacemos memoria, casi no hay programas hechos en éste lenguaje), y la razon principal es debido a que simplemente lo olvide (conste que ya lo habia mencionado en algun post). Para probar que aun estoy al pendiente, decidi hacer un par de programas con (segun google) las busquedas mas gfrecuentes relacionadas a python que conducian a mi blog.
Los números de Fibonacci.
def CalcFibonacci(Number):
v1 = 0
v2 = 1
v3 = 0
while v1 < Number:
print(v1)
v3 = v1 + v2
v1 = v2
v2 = v3
if __name__ == "__main__":
import sys
CalcFibonacci(int(sys.argv[1]))Fibonacci.py 200
La funcion de Ackerman.
def AckermanFunction(Number1, Number2):
if Number1 == 0:
return Number2 + 1
else:
if Number2 == 0:
return (AckermanFunction(Number1 - 1, 1))
return (AckermanFunction(Number1 - 1, AckermanFunction(Number1, Number2 - 1)))
if __name__ == "__main__":
import sys
try:
for i in range(4):
for j in range(5):
print(AckermanFunction(i, j),end=' ')
print()
except RecursionError:
print("Error: Se alcanzo el maximo de recursion permitido")Vamos a programar #60 - Los números de Fibonacci (Ver. C)
Antes de continuar, vamos a ver que es esta sucesion.
En matemáticas, la sucesión de Fibonacci es la siguiente sucesión infinita de números naturales: 0,1,1,2,3,5,8,13,21,34,55, … La sucesión comienza con los números 0 y 1,2 y a partir de estos, «cada término es la suma de los dos anteriores», es la relación de recurrencia que la define. A los elementos de esta sucesión se les llama números de Fibonacci. Esta sucesión fue descrita en Europa por Leonardo de Pisa, matemático italiano del siglo XIII también conocido como Fibonacci. Tiene numerosas aplicaciones en ciencias de la computación, matemática y teoría de juegos. También aparece en configuraciones biológicas, como por ejemplo en las ramas de los árboles, en la disposición de las hojas en el tallo, en las flores de alcachofas y girasoles, en las inflorescencias del brécol romanesco y en la configuración de las piñas de las coníferas. De igual manera, se encuentra en la estructura espiral del caparazón de algunos moluscos, como el nautilus. Wikipedia/SucesionDeFibonacci.Para ponerlo de manera sencilla, para calcular el valor de la sucesión, debemos de sumar los dos números previos, excepto cuando el valor de n sea 0 o 1, a partir de "n = 2", es cuando debemos de empezar a sumar por lo que tendríamos algo similar a lo siguiente:
El propósito del programa era encontrar una manera de hacerlo de forma secuencial y otra de forma re-cursiva. Partiendo de eso, podemos crear un programa cómo el que sigue:
#include <stdio.h>
long FibonacciNumbersRec(int n)
{
if (n == 0 || n== 1 )
return n;
else
return (FibonacciNumbersRec(n - 1) + FibonacciNumbersRec(n - 2));
}
long FibonacciNumbersIt(int n)
{
long v1 = 0;
long v2 = 1;
long v3, i;
for(i = 1; i <= n; i++)
{
v3 = v1+v2;
v1 = v2;
v2 = v3;
}
return v1;
}
int main()
{
printf("%4d\n", FibonacciNumbersIt(6));
printf("%4d\n", FibonacciNumbersRec(6));
}
El programa consta de dos funciones, una de ellas es "FibonacciNumbersRec" (Rec es por Recursive) y la otra es "FibonacciNumbersIt" (It por Iterative). Para la función "FibonacciNumbersRec", primeramente comprobamos si el parámetro "n" es cualquiera de los números 1 o 0, si es el caso, la función devuelve "n" cómo resultado, si no es el caso anterior, la función se mandará a llamar a si misma con el parámetro "n = n - 1" y al resultado de esto, se le sumará el valor que resulta de llamarse a si misma con parámetro de "n = n -2"; el valor que regresa la función será el resultado de sumar los casos anteriores.
Para evitar la recursividad, podemos aprovechar que la sucesión depende de los dos valores anteriores inmediatos, por lo que podemos hacer todo en un ciclo "for" y usando las variables auxiliares "v1","v2 y "v3". Cómo la sucesión comienza con 1 y con 0, le asignamos esos valores a "v1" y a "v2", el resultado para ese paso dentro de la sucesión, sera la suma "v1" + "v2", los asignamos a "v3" y tomando en cuenta lo mencionado hace un momento, le asignamos a "v1" el valor que tiene "v2" y a "v2" le asignamos el valor de "v3". Todo esto lo hacemos hasta que el iterador llegue al valor del parámetro "n". Finalmente la función regresará cómo resultado el valor de "v1".
Y bien, con el código anterior hemos demostrado que hay más de una forma para llegar al mismo resultado. Muchas veces es más fácil hacer uso de la recursividad, pero si por alguna razón no debemos (o no disponemos, dependiendo del lenguaje) usarla, siempre hay formas de encontrar una solución.
El código, al igual que el del post anterior, puedes copiarlo y probarlo en el compilador online.
Y bien. por ahora es todo, los leo luego.




