[英]Program never completes when loop is set to 4000000
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中
是的,您的代码中存在效率低下的问题,但是最大的问题是您误认为自己正在计算什么。
在每次迭代中, i
增加一,并且您在每一步中检查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
运行, 100000 loops, best of 3: 7.51 µs per loop
,比当前代码快3微秒(即,一旦您修复它)。
您正在计算前400万斐波那契数。 这需要一段时间。 在我用fibn & 1 == 0
替换fibn % 2 == 0
之后,我花了将近5分钟的时间来计算结果,大约是817 KB的数字-这种优化对这么大的数字产生了很大的影响。
换句话说,您的代码最终将完成-这将花费很长时间。
更新:您的版本在42分钟后完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.