当循环设置为4000000时,程序永远不会完成

时间:2018-01-23 12:42:08

标签: python

fib1 = 1
fib2 = 2

i = 0
sum = 0

while i < 3999998:

    fibn = fib1 + fib2

    fib1 = fib2
    fib2 = fibn

    i += 1

    if fibn % 2 == 0:
        sum = sum + fibn

print(sum + 2)

挑战是在4000000以下添加甚至斐波那契数字。它适用于小数量限制,例如10个数字。但是当设置为4000000时永远继续下去。 代码在Python中

2 个答案:

答案 0 :(得分:3)

是的,您的代码效率低下,但最大的问题是您误解了您的计算内容。

在每次迭代i增加1时,您在每一步检查是否i < 3999998。您正在有效地找到第一个 400万斐波纳契数

您应该将循环条件更改为while fib2 < 3999998

其他一些小的优化。利用python的交换语法x, y = y, x及其sum函数。在列表上计算一次总和稍微快一点,然后在循环中连续地对它们求和。

a, b = 1, 2
fib = []
while b < 3999998:
   a, b = b, a + b
   if b % 2 == 0:
      fib.append(b)

sum(fib) + 2

这在100000 loops, best of 3: 7.51 µs per loop中运行,比当前代码快3微秒(一旦修复它,就是这样)。

答案 1 :(得分:2)

你正在计算前400万个斐波纳契数。这需要一段时间。我用fibn % 2 == 0替换fibn & 1 == 0后,花了将近5分钟来计算结果,大约是817 KB的数字 - 这种优化会对如此大的数字产生很大的影响。

换句话说,你的代码最终会完成 - 这只需要很长时间。

更新:您的版本在42分钟后完成。