我再次尝试Project Euler问题,在问题2上,我被要求找到斐波那契序列中所有偶数的总和,小于400万。我可以使用下面的代码,使用While循环(在代码中显示为注释),但不使用for循环(这给了我巨大的数字,并使"c"超过了400万。
为什么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()
for循环并不意味着"当c == 4000000
时停止"。它的意思是"迭代序列range(4000000)
,这是一个从0到39999999的数字列表,并在序列的每个元素都设置了c
的情况下运行循环体一次"。
困难在于range()
返回一个列表(或Python 3中的迭代器)。每次通过循环都会得到该范围中的下一个数字。给c
指定一个不同的值并没有任何作用,因为for
并没有在c
中查找任何内容,它只是从范围中获取下一个数字并将其放入c
中。c
的值与for
循环完全无关。
您可以编写自己的迭代器,允许使用send()
重置迭代器值,但这有点棘手。你不妨使用while循环。
c
在从0到4M的整个范围内迭代,在循环的每次迭代中都会对其进行更改。你真的无法用我能想到的任何简单的for
循环来做到这一点。
我想指出,每三个斐波那契数都是偶数。你可以通过归纳来证明这一点。斐波那契数也是通过特征多项式x^2-x-1的递推关系来定义的。也就是说,它们有一个闭合形式的解F_n=a*c^n+b*d^n,其中c和d是特征多项式的零。由此产生的恒等式也被称为比奈公式。有关详细信息,请参阅维基百科。
因此,期望的结果是两个几何级数的和。维基百科会告诉你几何级数的闭式。
关键是,您可以在不迭代的情况下计算所需的结果。在我看来,这就是这个问题的真正原因。
您正在for循环内部更新c
:c = a+b
。请使用其他变量。