Saltar al contenido

¿Cómo puedo crear la serie de fibonacci usando una lista de comprensión?

El tutorial o código que hallarás en este post es la solución más eficiente y efectiva que encontramos a tus dudas o problema.

Solución:

No puedes hacerlo así: el lista de comprensión es evaluado primero, y luego esa lista se agrega a series. Entonces, básicamente, sería como si hubieras escrito:

series=[]
series.append(1)
series.append(1)
temp = [series[k-1]+series[k-2] for k in range(2,5)]
series += temp

Sin embargo, puede resolver esto usando lista de comprensión como una forma de efectos secundarios de la fuerza, como por ejemplo:

series=[]
series.append(1)
series.append(1)
[series.append(series[k-1]+series[k-2]) for k in range(2,5)]

Tenga en cuenta que aquí no agregue el resultado a la serie. La lista de comprensión solo se usa de tal manera que .append es llamado series. Sin embargo, algunos consideran que la comprensión de listas con efectos secundarios es bastante propensa a errores: no es muy declarativa y tiende a introducir errores si no se hace con cuidado.

Si sabe cuántos términos de la serie necesitará, puede escribir el código de forma compacta sin una lista de comprensión como esta.

def Fibonacci(n):
    f0, f1 = 1, 1
    for _ in range(n):
        yield f0
        f0, f1 = f1, f0+f1

fibs = list(Fibonacci(10))
print (fibs)

Si desea una cantidad indefinida de términos, puede usar esto, que es muy similar.

def Fibonacci():
    f0, f1 = 1, 1
    while True:
        yield f0
        f0, f1 = f1, f0+f1

fibs = []
for f in Fibonacci():
    fibs.append(f)
    if f>100:
        break
print (fibs)

Cuando necesite una colección potencialmente infinita de elementos, tal vez debería considerar una function con uno o más yield sentencias o una expresión generadora. Me encantaría poder hacer números de Fibonacci con una expresión generadora, pero aparentemente no se puede.

Podríamos escribirlo como una comprensión limpia de la lista de Python (o generador) usando su relación con la proporción áurea:

>>> series = [int((((1 + 5**0.5) / 2)**n - ((1 - 5**0.5) / 2)**n) / 5**0.5) for n in range(1, 21)]
>>> series
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
>>> 

o un poco más bien como:

>>> square_root_of_five = 5**0.5
>>> Phi = (1 + square_root_of_five) / 2
>>> phi = (1 - square_root_of_five) / 2
>>> 
>>> series = [int((Phi**n - phi**n) / square_root_of_five) for n in range(1, 21)]
>>> series
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]

valoraciones y reseñas

Recuerda algo, que puedes permitirte interpretar si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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