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中
答案 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分钟后完成。