2017-01-08 55 views
2

为什么它没有给出正确的总数第一个甚至斐波纳契数字高达4毫米?这个简单的python代码有什么问题?

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

'x = y; y = x + y'是错误的。 –

+0

即使更正后,总数也是错误的。 –

+1

'else:pass'不是必需的。只要删除它。 – mattmilten

回答

6

已经有解决具体的错误代码中的其他答案,所以我想提供一个完全不同的实现,达到您的既定目标:

高达给予了正确的总要先甚至Fibonacci数4 mn

如果你想找到甚至斐波那契数的总和达到某个极限,下面的代码可能是一个更实用的方法。它基于组合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要总结偶数斐波那契条款直到总和将超过400万,那么答案就是我上面所述 - 1089154.

  • 如果OP要总结所有甚至斐波那契4000000下条款,则表达if total + x > limit将变为x > limit和答案是4613732.

+0

条件应该是'x>限制' – Copperfield

+0

@Copperfield它取决于问题在OP被完全破坏之前是如何解释的。我将400万解释为*总数*的限制(即继续添加甚至斐波纳契条款直到4,000,000被超过)。 – Tagc

+0

OP希望斐波纳契数字的总和小于4.000.000,这是从乞讨 – Copperfield

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 
+1

我得到了一个不同的答案,因为我以不同的方式解释问题。 OP的问题是不明确的,但如果它是一个欧拉问题,你的解释更可能是正确的。如果我将'total + x> limit'更改为'x> limit',我会得到与您相同的答案。 – Tagc

+0

@Tagc,哦,这更有意义,你发现最大的总和少于4000000. –

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将停止迭代,当条件不再满足与其他人回答相同的方式

+0

这应该是一个挑战http://codegolf.stackexchange.com/ :) –

相关问题