2013-08-21 57 views
1

我試圖再次項目歐拉問題,並在problem 2,我被要求找到在400萬以下的斐波那契序列中所有偶數的總和。我可以使用下面的代碼使用While循環(在代碼中顯示爲註釋),但不使用for循環(這給我提供了巨大的數字,並且需要超過4百萬的'c'方法。爲x在範圍(y)與while循環:Python

爲什麼for循環不能在這裏工作

感謝

def fibo(): 
    z=[] 
    a=1 
    b=1 
    c=0 
    for c in range(0,4000000): #doesn't work; works with while (c<4000000) 
     c = a+b 
     if c%2 == 0 and c<4000000: 
      z.append(c) 
     a=b 
     b=c 
     print c 
    print 'sum is',sum(z) 

fibo() 
+1

您在'for'循環中對'c'所做的修改在下一次迭代時不會考慮。 –

回答

6

for循環並不意味着「在c == 4000000時停止」。這意味着「迭代序列range(4000000),這是一個從0到3999999的數字列表,並且運行循環體一次,其中c設置爲序列的每個元素」。

0

你更新c for循環的內部:。c = a+b使用不同的變量

1

c被遍歷整個範圍從0到4M,在循環的每次迭代中吹走您對其所做的更改。你不能用我能想到的任何簡單的for循環來做到這一點。

2

難度是range()返回一個列表(或Python 3中的迭代器)。每次通過循環都會得到範圍中的下一個數字。爲c指定一個不同的值不會執行任何操作,因爲for對於任何內容都沒有查看c,它只是從範圍中獲取下一個數字並將其放入cc的值與for循環完全無關。

你可以編寫你自己的迭代器,它允許你使用send()來重置迭代器的值,但是這寫起來有點棘手。你可以使用一個while循環。

1

我想指出,每個第三個斐波那契數是偶數。你可以通過歸納來證明這一點。另外斐波那契數是通過具有特徵多項式x^2-x-1的遞推關係來定義的。那就是他們有一個封閉形式解F_n = a * c^n + b * d^n其中c和d是特徵多項式的零點。由此產生的身份也被稱爲比奈公式。有關詳細信息,請參見Wikipedia

因此,所需的結果是兩個幾何級數的總和。 Wikipedia會告訴你幾何系列的封閉形式。

重點是,您可以計算所需的結果,而無需迭代。在我看來,這是這個問題的真正意義。