for x in range(y) vs. while loop: Python



我再次尝试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循环内部更新cc = a+b。请使用其他变量。

最新更新