我正在研究这个,我似乎有一个可行的解决方案,但我很难理解它的行为。
这是我所拥有的。
#!/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/