1

我再次尝试 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()
4

5 回答 5

6

for 循环并不意味着“何时停止c == 4000000”。它的意思是“遍历序列range(4000000),这是一个从 0 到 3999999 的数字列表,并运行循环体一次,并c设置为序列的每个元素”。

于 2013-08-21T21:17:57.920 回答
2

困难在于range()返回一个列表(或 Python 3 中的迭代器)。每次通过循环都会从范围中获取下一个数字。分配一个不同的值c不会做任何事情,因为for它没有寻找c任何东西,它只是从范围中获取下一个数字并将其放入c. 的值与循环c完全无关。for

您可以编写自己的迭代器,允许您使用它send()来重置迭代器值,但这有点难以编写。你不妨使用一个while循环。

于 2013-08-21T21:22:14.470 回答
1

c正在从 0 到 4M 的整个范围内进行迭代,从而消除您在循环的每次迭代中对其所做的更改。你不能用for我能想到的任何简单循环来做到这一点。

于 2013-08-21T21:16:46.833 回答
1

我想指出,每第三个斐波那契数都是偶数。你可以通过归纳来证明这一点。斐波那契数也是通过与特征多项式 x^2-x-1 的递归关系来定义的。也就是说,它们具有封闭形式的解 F_n = a*c^n + b*d^n,其中 c 和 d 是特征多项式的零点。由此产生的恒等式也称为比内公式。有关详细信息,请参阅维基百科

因此,期望的结果是两个几何级数的总和。维基百科会告诉你几何级数的封闭形式。

关键是您可以在不迭代的情况下计算所需的结果。在我看来,这就是这个问题的真正意义所在。

于 2013-08-21T21:28:57.820 回答
0

您正在更新cfor 循环内部: c = a+b. 使用不同的变量。

于 2013-08-21T21:16:46.680 回答