2011-06-30 14 views
1

私はProject Eulerの問題をPythonに習得するために取り組んでおり、2番目の問題の解決策を書いています(フィボナッチシーケンス内の偶数の項の和を求める400万を超える)。このコードは私に正しい解決策を与えてくれますが、生成したフィボナッチ数のリストから奇数番号の値を削除するには、モジュラス除算を2回使用する必要があります。ここで私が書いたソリューションです:Pythonモジュロ演算子を使用したリストの並べ替え

term_1 = 1 
term_2 = 2 
fibonacci_list = [1] 
while term_2 < 4000000: 
    fibonacci_list.append(term_2) 
    term_1, term_2 = term_2, term_1 + term_2 
for num in fibonacci_list: 
    if num % 2 != 0 
     fibonacci_list.remove(num) 
for num in fibonacci_list: 
    if num % 2 != 0 
     fibonacci_list.remove(num) 
return sum(fibonacci_list) 

を私はforループ1に入れた場合は、リストfibonacci_listには、次のようになります。

[2, 5, 8, 21, 34, 89, 144, 377, 610, 1597, 2584, 6765, 10946, 28657, 46368, 121393, 196418, 514229, 832040, 2178309, 3524578] 

は、すべての奇数番号の用語は、モジュラス部門に失敗すべきではありませんテストして削除しますか?奇数番号のすべての用語を削除するためにforループを2回実行する必要があるのはなぜですか?

答えて

3

あなたが直面している問題は、リストを反復しながらリストからアイテムを削除しようとしていることです。

この同じトピックについての前の質問については、here,hereおよびhereを参照してください。

これは実際には問題であると仮定し、反復処理中にリストから項目を削除することは禁止されているとしましょう。

これを繰り返すうちにリストからアイテムを削除する必要がないのはどういうことでしょうか?あなたがProject Eulerをやっているので答えが得られるかどうかわからないので、明らかな答えを出さないようにします。

1

これは簡単に見ただけですが、反復処理中のコレクションに突然変異を起こしているように見えます。つまり、アイテムを削除すると、現在のアイテム/次のアイテムへのポインタが影響を受け、最初に通過する。

0

フィボナッチシーケンスの3番目の項のみが偶数であることはわかりません。代わりにそれを使うことができます。

いずれにしても、反復処理中にシーケンスを変更すると、the classic trapになりました。しないでください:

fibonacci_list[:] = [x for x in fibonacci_list if x%2==0] 
+1

をあなたは行うだけでできるfibonacci_list = [fibonacci_list中のxのためのxの場合のx%2 == 0]リストの内包が作成されますので、とにかく新しいリスト。 –

0

プログラムをこれと比較してください。それは助けるかもしれない。

fibonacci = [1,2] 
num = 3 
while num < 4000000: 
    fibonacci.append(num) 
    len_ = len(fibonacci) 
    num = fibonacci[len_-2] + fibonacci[len_-1] 

sum = 0 
for num in fibonacci: 
    if num%2 == 0: sum += num 

print sum 

なぜ奇数番号のエントリをリストから削除する必要がないのか分かりません。それだけで偶数番号のものを追加してください。

0

これは私にエラトステネスの篩を覚えています。だから私はarrayにあなたのリストを変換すると仮定し、この溶液を提案したい:

fibonacci_list = fibonacci_list [ fibonacci_list % 2 != 0 ] 
関連する問題