2010-10-17 15 views
12

Ich brauche ein Programm zu machen, die gedruckt für die Höhe der Fibonacci-Zahlen fragt und dann druckt sie wie 0, 1, 1, 2 ..., aber ich kann es an die Arbeit. Mein Code sieht wie folgt vor: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

Ich denke, 'während True' prägnante –

+0

ist Wie könnte die zweite Iteration "a = 1" zu verstehen? Müssten wir nicht a = a + b schreiben anstatt "a, b = b, a + b"? – user177196

Antwort

23

Sie geben a zu viele Bedeutungen:

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

gegen

a = fib()  

Sie werden nicht in das Problem laufen (wie oft), wenn Sie geben Ihre Variablen aussagekräftigeren Namen (3 verschiedene Verwendungen des Namens a in 10 Zeilen Code!):

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

und range(a)-range(amount) ändern.

2

Ihre a ist ein globaler Name so zu sagen.

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

Wenn Python eine a sieht, es denkt, dass Sie über die oben genannten man reden. Etwas anderes (anderswo oder hier) zu nennen, sollte helfen.

2

Python ist eine dynamisch typisierte Sprache. Der Typ einer Variablen wird zur Laufzeit festgelegt und kann während der Ausführung variieren. Hier haben Sie zuerst a deklariert, um einen Integer-Typ zu halten, und später haben Sie ihm eine Funktion zugewiesen, und so wurde sein Typ nun zu einer Funktion.

Sie versuchen, als Argument ‚ein‘ gelten range() Funktion, die int und arg erwartet, aber sie in der Tat haben eine Funktion Variable als Argument zur Verfügung gestellt.

der korrigierte Code shoud

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

sein, dies

0

arbeiten werde ich dies vor einer Weile bauen haben:

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

Nein, die fab im Laufe der Zeit wachsen wird, so dass es isn Es ist keine perfekte Lösung.

17

ich diese Methode verwenden würde:

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

Sie können auch unendlich Generator aufzählen verwenden:

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

Auch können Sie die geschlossene Lösung versuchen (keine Garantien für sehr große Werte von n aufgrund Abrundung/Überlauffehler):

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

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

Da Sie einen Generator schreiben, warum nicht zwei Ausbeuten verwenden, um Speichern Sie den zusätzlichen Shuffle?

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

Sie hatte die richtige Idee und eine sehr elegante Lösung, alles, was Sie brauchen, fix zu tun ist, Ihr Swapping und das Hinzufügen Aussage von a und b. Ihre Rendite Erklärung sollte nach dem Swap als auch gehen

a, b = b, a + b ####a,b = a+b,a ##### sollte

`###yield a` 
0

Hier ist, wie es mit n = 50 zu tun. Sie können natürlich die 50 durch Benutzereingaben ersetzen

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

Um die Fibonacci-Zahlen bis eine beliebige Anzahl (100 in diesem Fall) mit Generator zu erhalten, können Sie dies tun.

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

einfache Art und Weise Fibonacci-Reihe bis n Anzahl

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

Es ausdrucken sieht aus wie Sie die a zweimal verwenden. Versuchen Sie, das auf einen anderen Variablennamen zu ändern.

Das folgende scheint für mich gut zu funktionieren.

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

Ich mag diese Version:

array = [0,1] 

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