2010-10-17 34 views
12

Tôi cần phải thực hiện một chương trình yêu cầu số lượng mã số in được in và sau đó in chúng như 0, 1, 1, 2 ... nhưng tôi không thể làm cho nó hoạt động. Mã của tôi trông như sau: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

Tôi nghĩ rằng 'khi True' ngắn gọn hơn –

+0

Làm thế nào lặp thứ 2 có thể hiểu được "a = 1"? Chúng ta không nên viết a = a + b chứ không phải là "a, b = b, a + b" – user177196

Trả lời

23

Bạn đang đưa ra a quá nhiều ý nghĩa:

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

vs

a = fib()  

Bạn sẽ không gặp phải vấn đề (như thường) nếu bạn cung cấp cho các biến của bạn nhiều tên mô tả hơn (3 cách sử dụng khác nhau của tên a trong 10 dòng mã!):

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

và thay đổi range(a) thành range(amount).

2

a là tên toàn cục để nói.

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

Bất cứ khi nào Python thấy a, nó cho rằng bạn đang nói về điều trên. Gọi nó là cái gì đó khác (ở nơi khác hoặc ở đây) sẽ giúp ích.

2

python là ngôn ngữ được nhập động. loại biến được xác định tại thời gian chạy và biến có thể thay đổi khi quá trình thực hiện đang diễn ra. Ở đây lúc đầu, bạn đã khai báo một kiểu số nguyên và sau đó bạn đã gán một hàm cho nó và do đó kiểu của nó bây giờ đã trở thành một hàm.

bạn đang cố gắng áp dụng 'một' như là đối số để phạm vi() chức năng mà hy vọng và int arg nhưng bạn đã có hiệu lực được cung cấp một biến chức năng như là đối số.

mã chỉnh shoud được

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

này sẽ làm việc

0

Tôi đã xây dựng này một thời gian trước:

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

Không rằng fab sẽ phát triển theo thời gian, vì vậy nó isn không phải là một giải pháp hoàn hảo.

17

Tôi sẽ sử dụng phương pháp này:

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

Ngoài ra bạn có thể sử dụng máy phát điện liệt kê vô hạn:

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

Ngoài ra bạn có thể thử phương pháp dạng đóng (không đảm bảo cho giá trị rất lớn của n do lỗi làm tròn/overflow):

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

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

Kể từ khi bạn đang viết một máy phát điện, tại sao không sử dụng hai sản lượng, để tiết kiệm thêm 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

Bạn đã có ý tưởng đúng đắn và một giải pháp rất thanh lịch, tất cả các bạn cần làm là sửa chữa trao đổi của bạn và thêm tuyên bố của a và b. tuyên bố lợi nhuận của bạn nên đi sau khi hoán đổi của bạn cũng

a, b = b, a + b #### nên a,b = a+b,a #####

`###yield a` 
0

Dưới đây là làm thế nào để làm điều đó với n = 50. Bạn có thể tất nhiên thay thế 50 bởi người dùng nhập vào

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

Để có được những con số fibonacci đến bất kỳ số (100 trong trường hợp này) với máy phát điện, bạn có thể làm điều này.

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

Cách đơn giản để in Fibonacci loạt đến số 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

Dường như bạn đang sử dụng a hai lần. Hãy thử thay đổi điều đó thành một tên biến khác.

Các nội dung sau có vẻ hiệu quả với tôi.

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

tôi thích phiên bản này:

array = [0,1] 

for i in range(20): 
    x = array[0]+array[1] 
    print(x) 
    array[0] = array[1] 
    array[1] = x 
Các vấn đề liên quan