为什么它没有给出正确的第一个甚至斐波纳契数最多4个月的总数?
x = 1
y = 2
list = [1,2]
while y< 4000000:
z= x+y
x=y
y=z
list.append (y)
list_even = []
for a in list:
if a%2 == 0:
list_even.append (a)
else:
pass
total = sum(list_even)
print (total)
答案 0 :(得分:6)
还有其他答案已经解决了代码中的特定错误,所以我想提供一个完全不同的实现来实现您的既定目标:
给出正确的第一个偶数斐波纳契数的总数达到4 mn
如果你想找到偶数Fibonacci数的总和达到某个极限,下面的代码可能是实现它的更实用的方法。它基于组合Python生成器,这应该有助于使代码更容易遵循,更可重用。
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
def evens(l):
for x in l:
if x % 2 == 0:
yield x
def sum_even_fibonacci(limit):
total = 0
for x in evens(fib()):
if total + x > limit:
return total
total += x
if __name__ == '__main__':
print(sum_even_fibonacci(4000000))
<强>输出强>
1089154
修改强>
OP究竟在问什么,这是不明确的。
如果OP希望将平均斐波纳契项加总,直到总和超过4,000,000 ,那么答案就是我上面所说的 - 1089154。
如果OP希望将所有甚至斐波那契条件的总和低于4,000,000 ,则表达式if total + x > limit
将更改为x > limit
,答案将为4613732。
答案 1 :(得分:2)
我在Project Euler上认识到这是Problem 2。出于某种原因,@ Tagc得到了错误的答案。我也使用了发电机而不是列表。这是我的解决方案:
def fibonacci():
term_0, term_1 = 1,2
while True:
yield term_0 + term_1
term_0, term_1 = term_1, term_0 + term_1
fibonacci_sum = 2
for n in fibonacci():
if n > 4000000: break
if n % 2 == 0: fibonacci_sum += n
print(fibonacci_sum)
输出:
$ python 002.py
4613732
答案 2 :(得分:2)
只是为了好玩,这是一个单线版
from itertools import takewhile
def fib():
fk, fk1 = 0,1
while True:
yield fk
fk, fk1 = fk1, fk+fk1
print( sum( x for x in takewhile(lambda f:f<4000000,fib()) if x%2==0 ) )
此处takewhile将在不再满足条件时以与其他答案相同的方式停止迭代