web-dev-qa-db-fra.com

Générateur Fibonacci Python

Je dois créer un programme qui demande le nombre de nombres de Fibonacci imprimés, puis les imprimer comme 0, 1, 1, 2 ... mais je ne parviens pas à le faire fonctionner. Mon code a l'aspect suivant:

a = int(raw_input('Give amount: '))

def fib():
    a, b = 0, 1
    while 1:
        yield a
        a, b = b, a + b

a = fib()
a.next()
0
for i in range(a):
    print a.next(),
14
John

Je voudrais utiliser cette méthode:

Python 2

a = int(raw_input('Give amount: '))

def fib(n):
    a, b = 0, 1
    for _ in xrange(n):
        yield a
        a, b = b, a + b

print list(fib(a))

Python 3

a = int(input('Give amount: '))

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

print(list(fib(a)))
24
rubik

Vous donnez a trop de significations:

a = int(raw_input('Give amount: '))

vs.

a = fib()       

Vous ne rencontrerez pas le problème (comme souvent) si vous donnez à vos variables des noms plus descriptifs (3 utilisations différentes du nom a sur 10 lignes de code!):

amount = int(raw_input('Give amount: '))

et remplacez range(a) par range(amount).

23
unutbu

Puisque vous écrivez un générateur, pourquoi ne pas utiliser deux rendements, pour économiser en faisant le shuffle supplémentaire?

import itertools as it

num_iterations = int(raw_input('How many? '))
def fib():
    a,b = 0,1
    while True:
        yield a
        b = a+b
        yield b
        a = a+b

for x in it.islice(fib(), num_iterations):
    print x

.....

13
John La Rooy

Vous pouvez faire cela pour obtenir les nombres de fibonacci jusqu'à n'importe quel nombre (100 dans ce cas) avec le générateur.

def getFibonacci():
    a, b = 0, 1

    while True:
        yield b
        b = a + b
        a = b - a

for num in getFibonacci():
    if num > 100:
        break
    print(num)
2
Hanzel

Vous pouvez également essayer la solution de formulaire fermé (aucune garantie pour les très grandes valeurs de n en raison d’erreurs d’arrondi/dépassement de capacité):

 root5 = pow (5, 0.5) 
 ratio = (1 + root5)/2 
 
 def fib (n): 
 return int ((pow (ratio, n) - pow (1 - ratio, n))/racine5) 
2
Patrick Krecker

Méthode simple pour imprimer les séries de Fibonacci jusqu'au numéro n

def Fib(n):
    i=a=0
    b=1
    while i<n:
        print (a)
        i=i+1
        c=a+b
        a=b
        b=c




Fib(input("Please Enter the number to get fibonacci series of the Number :  "))
2
Kuldeep Choughule

Votre a est un nom global à dire.

a = int(raw_input('Give amount: '))

Chaque fois que Python voit une a, il pense que vous parlez de la précédente. Appeler quelque chose d'autre (ailleurs ou ici) devrait aider.

2
Jungle Hunter

Python est un langage typé dynamiquement. le type d'une variable est déterminé au moment de l'exécution et il peut varier en fonction de l'exécution. Ici, dans un premier temps, vous avez déclaré un type entier, puis vous lui avez attribué une fonction. le type est maintenant devenu une fonction.

vous essayez d'appliquer ' a ' comme argument à range () function qui attend un argument, mais vous avez en fait fourni une variable de fonction comme argument.

le code corrigé devrait être

 a = int(raw_input('Give amount: '))

def fib():
    a, b = 0, 1
    while 1:
        yield a
        a, b = b, a + b

b = fib()
b.next()

for i in range(a):
    print b.next(),

ça va marcher

2
appusajeev
def fibonacci(n):
    fn = [0, 1,]
    for i in range(2, n):
        fn.append(fn[i-1] + fn[i-2])
    return fn
2
Alex

Vous avez eu la bonne idée et une solution très élégante, tout ce que vous avez à faire est d’échanger et d’ajouter la déclaration a et b. Votre relevé de rendement devrait également viser votre échange

a, b = b, a + b #### devrait être a,b = a+b,a #####

`###yield a`
2
Jeremy

Aussi, vous pouvez utiliser énumérer infini générateur

for i,f  in enumerate(fib()):
    print i, f
    if i>=n: break
2
Tony Veijalainen

Il semble que vous utilisiez la a deux fois. Essayez de changer cela en un nom de variable différent.

Ce qui suit semble bien fonctionner pour moi.

def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a+b

f = fib()
for x in range(100):
    print(f.next())
1
domgreen

J'ai construit cela il y a quelque temps:

a = int(raw_input('Give amount: '))

fab = [0, 1, 1]
def fab_gen():
    while True:
        fab.append(fab[-1] + fab[-2])
        yield fab[-4]

fg = fab_gen()
for i in range(a): print(fg.next())

Non, fab augmentera avec le temps, ce n'est donc pas une solution parfaite.

1
Martijn

j'aime cette version:

array = [0,1]

for i in range(20):
   x = array[0]+array[1]   
   print(x)
   array[0] = array[1]
   array[1] = x
0
Eirik Fesker