2013-03-01 46 views
-2

我剛開始做項目歐拉問題2,想知道如果有人可以幫助我解決這個腳本:所有Fibonacci數的總和高達一百萬

def fib(): 
    x,y = 0,1 
    while True: 
     yield x 
     x,y = y, x+y 

def even(seq): 
    for number in seq: 
     if not number % 2: 
      yield number 

def under_a_million(seq): 
    for number in seq: 
     if number > 4000000: 
      break 
     yield number 

print sum(even(under_a_million(fib()))) 

此代碼應該找到的總和所有斐波那契數字直到一百萬。現在我遇到了第7行的一些問題。

+7

我縮進了你的代碼,使它顯示爲代碼,但看起來像縮進被搞砸了。看看它,並理順它。 - 另外,發佈確切的回溯通常對這些事情有幫助。 – mgilson 2013-03-01 01:38:55

+0

非常感謝。 – seamonkey8 2013-03-01 01:41:20

+0

我將你的代碼複製並粘貼到一個文件中,並使用python 2.7運行它,它工作。 – daveydave400 2013-03-01 01:47:37

回答

1

你好Seamonkey和歡迎來到SO。我很高興你對這個問題投入了更多努力,而不是你最後的:)

我將一步一步地通讀代碼。對於簡單的問題,我覺得這是比較容易使用的功能,因爲他們可以討厭當一個人有處理全局變量

#This part of the code gets the entire fibonacci sequence 
list_of_numbers = [] 
even_fibs = [] 
x,y = 0,1 #sets x to 0, y to 1 
while y <= 4000000: #Gets numbers till 4 million 
    list_of_numbers.append(y) 
    x, y = y, x+y #updates the fib sequence 

在這個代碼塊,(你可以把它改成一個函數,如果你願意),我們計算完整的斐波那契數列,高達400萬。我們還創建了兩個列表,list_of_numberseven_fibs。第一個用於存儲整個序列,第二個用於幫助我們存儲偶數。在下一個塊。

coord = 0 
for number in range(len(list_of_numbers)): 
    test_number = list_of_numbers [coord] 

    if (test_number % 2) == 0: 
     even_fibs.append(test_number) 
    coord+=1 

這裏我測試了列表list_of_numbers中的數字是否均勻。如果是,我將它們添加到even_fibs列表中。你可以在名單上看到here

print "Normal: ", list_of_numbers #outputs full sequence 
print "\nEven Numbers: ", even_fibs #outputs even numbers 
print "\nSum of Even Numbers: ", sum(even_fibs) #outputs the sum of even numbers 

這只是輸出我們的發現。


既然你似乎喜歡功能,我在這裏添加了代碼。解釋和上面一樣。

#This part of the code gets the entire fibonacci sequence 
list_of_numbers = [] 
even_fibs = [] 

def fib(list_of_numbers): 

    x,y = 0,1 #sets x to 0, y to 1 
    while x+y <= 4000000: #Gets numbers till 4 million 
     list_of_numbers.append(y) 
     x, y = y, x+y #updates the fib sequence 
    return list_of_numbers 

def even(list_of_numbers, even_fibs): 
    coord = 0 
    for number in range(len(list_of_numbers)): 
     test_number = list_of_numbers [coord] 

     if (test_number % 2) == 0: 
      even_fibs.append(test_number) 
     coord+=1 
    return even_fibs 

fib(list_of_numbers) #call fib function 

even(list_of_numbers, even_fibs) #Call the even function 
#Output 
print "Normal: ", list_of_numbers 
print "\nEven Numbers: ", even_fibs 
print "\nSum of Even Numbers: ", sum(even_fibs) 
1

您的代碼可以正常運行。
至少是我的版本之後的版本。

如果您在代碼中發現錯誤,可能是因爲錯誤的縮進? 我運行此代碼沒有問題。

注意的問題是,「斐波納契數列,其值不超過,發現即使值項之和」

所以

def fib(): 
    x,y = 0,1 
    while True: 
     yield x 
     x,y = y, x+y 

def even(seq): 
    for number in seq: 
     if not number % 2: 
      yield number 

def under_a_million(seq): 
    for number in seq: 
     if number > 4000000: # <------------ 
      break 
     yield number 

print sum(even(under_a_million(fib()))) 

BTW,很好看發電機正在使用。這幾乎就像在Haskell懶惰評價:)

+0

thx我想我沒有讀得很好 – seamonkey8 2013-03-01 02:14:27