2017-01-08 4 views
2

なぜ4Mnまでの最初の偶数フィボナッチ数の正しい合計が出ていないのですか?この単純な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

あり、すでにあなたのコード内の特定のバグに対処する他の回答があるので、私はあなたの定められた目標を達成し、完全に異なる実装を提供したい:最初の正しい合計を配っ

さえ件までの数字をフィボナッチ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は、合計は4,000,000を上回るだろうまでも、フィボナッチ用語を合計したい場合は、答えは私が上記で述べたものです - OPがすべてでもフィボナッチを合計したい場合1089154.

  • 4,000,000下の用語は、その式if total + x > limitx > limitに変化するであろうと答えが4613732.

+0

条件は 'x> limit'でなければなりません – Copperfield

+0

@Copperfield OPが完全にそれをマングルする前に、質問がどのように解釈されるかによって決まります。私は4,000,000を* total *の上限と解釈しました(つまり、フィボナッチの条件を4,000,000を超えるまで続けます)。 – Tagc

+0

OPは、evensフィボナッチ数の合計が4.000.000未満であることを懇願しているので、それほど明白です。 – Copperfield

2

Iだろう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の問題はあいまいですが、Project Eulerの問題であればあなたの解釈は正しいと思われます。 'total + x> limit'を' x> limit'に変更すると、あなたと同じ答えが得られます。 – Tagc

+0

@Tagc、ああ、それは理にかなっている、あなたは4000000未満の最大の合計を見つける。 –

2

楽しみのためだけに、これはここにtakewhile 1つのライナーバージョン

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)) 

では、反復を停止しません他の人と同じように答えた

+0

これはhttp://codegolf.stackexchange.com/に挑戦する必要があります:) –

関連する問題