我正在研究这个,我似乎有一个有效的解决方案,但我很难理解它的行为。
这就是我所拥有的。
#!/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的Fibonacci序列,如下所示,您将看到下面的结果。
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。为什么这样?
答案 0 :(得分:3)
通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数值项的总和。
你只需要循环直到你击中了一个> 400000不是你的代码试图做的第400万个斐波纳契数,你可以简化为使用生成函数和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)
几分钟后仍在运行。
答案 1 :(得分:1)
使用for counter in range(0, limit)
你的函数中有'限制'迭代。例如,如果你的'limit'变量是10,你将不会得到甚至小于10的fibonachi数字的总和,但你将得到前10个fibonachi数字的总和。
为了让您的代码正常运行,您需要按for counter in range(0, limit)
重新设置while last < limit
,每当您发现最后一个是偶数时,您将其添加到总数中。
答案 2 :(得分:1)
您可以稍微清理一下该生成函数。我就是这样写的。
def fib(x):
a = 1
b = 1
yield a
yield b
a,b = b,a+b
while b<=x:
yield b
a,b = b,a+b
这将为您提供一个生成函数,它将为您提供小于或等于x的所有Fibonacci数字(我们在这里应该更加小心,因为我们将返回前两个数字,无论如何)。
然后我们就可以了
sum(x for x in fib(4000000) if x%2==0)
答案 3 :(得分:1)
您应该将代码更改为仅生成数字,而不是总和或仅更改返回的yield,并删除sum()keyworkd,如下所示:
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
return total
print even_fib_sums(5)
答案 4 :(得分:0)
在第一个代码段中,您总结了整数,而不是仅仅产生数字。如果您希望在第一个代码段中输入10作为5的输入,则应该通过以下任一方式修改代码(不是为了提高效率,只是为了解决问题):
...
number = before_last + last
if not number % 2:
yield number
print sum(even_fib_sums(4000000))
或
...
number = before_last + last
if not number % 2:
total += number
return total
print even_fib_sums(4000000)