2010-10-17 14 views
12

Potrzebuję zrobić program, który prosi o liczbę wydrukowanych liczb fibonacci, a następnie wypisze je jako 0, 1, 1, 2 ... ale nie mogę go uruchomić. Mój kod wygląda następujące: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

myślę 'podczas gdy prawda' jest bardziej zwięzły –

+0

Jak można zrozumieć 2. iteracja "a = 1"? Nie powinniśmy pisać a = a + b zamiast "a, b = b, a + b" – user177196

Odpowiedz

23

dajesz a zbyt wiele znaczeń:

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

porównaniu

a = fib()  

Nie napotkasz problem (jak często), jeżeli nadajesz zmiennym bardziej opisowe nazwy (3 różne zastosowania nazwy a w 10 liniach kodu!):

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

i zmień range(a) na range(amount).

2

Twoja a jest globalną nazwą, która można rzec.

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

Ilekroć Python widzi a, to myśli, że mówimy o ponad jeden. Nazwanie tego czymś innym (gdzie indziej lub tutaj) powinno pomóc.

2

python jest językiem dynamicznie wpisywanym. Typ zmiennej jest określany w czasie wykonywania i może się zmieniać w trakcie wykonywania. Na początku zadeklarowałeś, że chcesz utrzymywać typ całkowity, a później przypisałeś do niego funkcję i jego typ stał się teraz funkcją.

staramy się stosować „” jako argument do przedziale() funkcję, która oczekuje i int arg ale już w życie, pod warunkiem zmienną funkcję jako argument.

poprawiony kod Powinni być

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

to zadziała

0

mam budować to jakiś czas temu:

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

nr fab że będzie rosnąć w miarę upływu czasu, więc nieprawdaż Idealne rozwiązanie.

17

Chciałbym skorzystać z tej metody:

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

Również można użyć nieskończonej wyliczyć generator:

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

Ponadto można spróbować zamknięty rozwiązanie formularz (bez gwarancji dla bardzo dużych wartości n powodu błędów zaokrąglania/przelewowych):

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

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

Skoro piszesz generator, dlaczego nie używają dwa plony, aby zapisać robiąc dodatkowe 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

Miałaś dobry pomysł i bardzo eleganckie rozwiązanie, wszystko co musisz zrobić, to naprawić swapping i dodanie zestawienie a i b. Twoja wypowiedź plon powinien iść po zamianie także

a, b = b, a + b #### powinny być a,b = a+b,a #####

`###yield a` 
0

Oto jak to zrobić z n = 50. Można oczywiście wymienić 50 przez wejście użytkownika

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

Aby uzyskać numery Fibonacciego till dowolnej liczby (100 w tym przypadku) z generatora, można to zrobić.

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

prosty sposób drukować szereg Fibonacciego do liczby 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

Wygląda używasz a dwukrotnie. Spróbuj zmienić to na inną nazwę zmiennej.

Następujące wydaje się, że działa doskonale dla mnie.

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

lubię tej wersji:

array = [0,1] 

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