2010-10-17 11 views
12

Ho bisogno di fare un programma che richiede la quantità di numeri di Fibonacci stampati e poi li stampa come 0, 1, 1, 2 ... ma non riesco a farlo funzionare. Il mio codice è il seguente:Python Fibonacci Generator

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

penso 'mentre True' è più conciso –

+0

Come potrebbe la seconda iterazione di capire "a = 1"? Non dovremmo scrivere a = a + b piuttosto che "a, b = b, a + b" – user177196

risposta

23

Si stanno dando a troppi significati:

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

vs.

a = fib()  

Non sarà eseguito nel problema (come spesso) se date le vostre variabili nomi più descrittivi (3 diversi usi del nome a in 10 righe di codice!):

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

e modificare range(a) a range(amount).

2

Il tuo a è un nome globale, per così dire.

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

Ogni volta che vede un Python a, si pensa che si sta parlando a quello superiore. Chiamarlo qualcos'altro (altrove o qui) dovrebbe aiutare.

2

python è un linguaggio digitato in modo dinamico. il tipo di variabile viene determinato in fase di esecuzione e può variare a seconda dell'esecuzione. Qui, in un primo momento, si è dichiarato un a contenere un tipo intero e in seguito è stata assegnata una funzione e quindi il suo tipo ora è diventato una funzione.

che si sta tentando di applicare 'un' come argomento di gamma) funzione (che si aspetta e int arg, ma si è in effetti fornito una variabile funzione come argomento.

il codice corretto shoud essere

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

questo funzionerà

0

Ho costruire questo qualche tempo fa:

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()) 

No che fab crescerà nel tempo, in modo da esso isn è una soluzione perfetta

17

vorrei utilizzare questo metodo:

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

Inoltre è possibile utilizzare enumerare generatore infinito:

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

Inoltre è possibile provare la soluzione in forma chiusa (non ci sono garanzie per molto grandi valori di n a causa di errori di arrotondamento/overflow):

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

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

Dal momento che si sta scrivendo un generatore, perché non usare due rendimenti, a salvare facendo il rimescolamento extra?

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

hai avuto l'idea giusta e una soluzione molto elegante, tutto quello che dovete fare è fissare il vostro scambio e l'aggiunta di dichiarazione di a e b. La sua dichiarazione resa dovrebbe andare dopo lo swap così

a, b = b, a + b #### dovrebbe essere a,b = a+b,a #####

`###yield a` 
0

Ecco come farlo con n = 50. Ovviamente si può sostituire la 50 da input dell'utente

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

Per ottenere i numeri di Fibonacci fino a qualsiasi numero (100 in questo caso) con il generatore, si può fare questo.

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

modo semplice per stampare serie di Fibonacci fino al numero 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 : ")) 
0

Sembra che si sta utilizzando il a due volte. Prova a cambiarlo con un nome di variabile diverso.

Quanto segue sembra funzionare perfettamente per me.

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

mi piace questa versione:

array = [0,1] 

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