繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM