2010-10-17 31 views
12

J'ai besoin de faire un programme qui demande la quantité de numéros de fibonacci imprimés, puis les imprime comme 0, 1, 1, 2 ... mais je ne peux pas le faire fonctionner. Mon code ressemble le suivant:Générateur Python Fibonacci

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(), 
+1

Je pense que 'while True' est plus concis –

+0

Comment la 2e itération comprendre "a = 1"? Ne devrions-nous pas écrire a = a + b plutôt que "a, b = b, a + b" – user177196

Répondre

23

Vous donnez a trop de significations:

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

contre

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 dans 10 lignes de code!):

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

et de remplacer range(a) par range(amount).

2

Votre a est un nom global de soi-disant.

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

Chaque fois que Python voit une a, il pense que vous parlez celui ci-dessus. L'appeler autrement (ailleurs ou ici) devrait aider.

2

python est un langage typé dynamiquement. le type d'une variable est déterminé au moment de l'exécution et peut varier au cours de l'exécution. Ici, vous avez d'abord déclaré a pour contenir un type entier et plus tard vous lui avez assigné une fonction et donc son type est maintenant devenu une fonction.

vous essayez d'appliquer « un » comme argument de range() qui attend et int arg mais vous avez en effet fourni une variable de fonction comme argument.

le code corrigé qui devraient ê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(), 

cela fonctionnera

0

J'ai construire ce il y a un certain 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 que fab va croître au fil du temps, il ISN 't une solution parfaite.

17

J'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))) 
1

vous pouvez également utiliser énumérer générateur infini:

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

Aussi, vous pouvez essayer la solution de forme fermée (aucune garantie pour des valeurs très importantes de n en raison d'erreurs d'arrondi/débordement):

 
root5 = pow(5, 0.5) 
ratio = (1 + root5)/2 

def fib(n): 
    return int((pow(ratio, n) - pow(1 - ratio, n))/root5) 
13

Puisque vous écrivez un générateur, pourquoi ne pas utiliser deux rendements, à économiser faire 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 

.....

1

Vous avez eu la bonne idée et une solution très élégante, tout ce que vous devez faire est votre solution et swapping déclaration en ajoutant a et b. Votre déclaration de rendement devrait aller après votre échange et

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

`###yield a` 
0

Voici comment faire avec n = 50. Vous pouvez bien sûr remplacer le 50 par l'entrée utilisateur

def fibo(): 
    yield 1 
    yield 1 
    formerOfFormer = 1 
    former = 1 
    while True: 
     newVal = formerOfFormer + former 
     formerOfFormer = former 
     former = newVal 
     yield newVal 


generator = fibo() 
for i in xrange(50): 
    print generator.next() 
1
def fibonacci(n): 
    fn = [0, 1,] 
    for i in range(2, n): 
     fn.append(fn[i-1] + fn[i-2]) 
    return fn 
0

Pour obtenir les numéros de fibonacci jusqu'à un nombre quelconque (100 dans ce cas) avec un générateur, vous pouvez le faire.

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

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

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

Une façon simple d'imprimer série de Fibonacci jusqu'à n nombre

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 : ")) 
0

Il semble que vous utilisez le 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()) 
0

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