我正在研究这个,我似乎有一个可行的解决方案,但我很难理解它的行为。

这是我所拥有的。

#!/usr/bin/python



def even_fib_sums(limit):
    number = 1
    last = 0
    before_last = 0
    total = 0
    for counter in range (0,limit):
     before_last = last
     last = number
     number = before_last + last
     if not number % 2:
        total += number
        yield total

print sum(even_fib_sums(4000000))

我是编程新手,但考虑到我需要遍历范围内的所有 4000000 个数字,这对我来说不是很有效。

如果我使用相同的方法生成最多 5 的斐波那契数列,如下所示,您将看到以下结果。
def generate_fib(limit):
    number = 1
    last = 0
    before_last = 0
    total = 0
    for counter in range (0,limit):
     before_last = last
     last = number
     number = before_last + last
     print number

generate_fib(5)

结果:1,2,3,5,8

结果中的这些数字中,只有 2 和 8 % 2 == 0。
总和应该是 10,但如果我要使用上面的第一个片段,我将返回 12。为什么这样?

最佳答案

通过考虑 Fibonacci 数列中值不超过 400 万的项,找出偶数项的总和。

您只需要循环直到遇到一个大于 400000 的 fib,而不是您的代码试图执行的第 4 百万个斐波那契数,您可以简化为使用带有 sum 的生成器函数,只产生偶数并在您点击时打破循环斐波那契数 > 4000000:

def fib(n):
    a, b = 0, 1
    while a <= n:
        a, b = b, a + b
        if not b & 1:
            yield b


print(sum(fib(4000000)))

计算需要几分之一秒:
In [5]: timeit sum(fib(4000000))

100000 loops, best of 3: 6 µs per loop

几分钟后尝试 timeit even_fib_sums(4000000) 仍在运行。

关于python - 偶数斐波那契数之和 < X,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34582649/

10-11 06:45