1

私はプロジェクト オイラー問題に取り組んで python を学ぼうとしており、2 番目の問題 (400 万を超えないフィボナッチ数列の偶数項の合計を見つける) の解決策を書きました。このコードで正しい解が得られますが、生成したフィボナッチ数のリストから奇数の値を削除するために、モジュラス除算を 2 回使用する必要があります。ここに私が書いた解決策があります:

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 回実行する必要があるのはなぜですか?

4

5 に答える 5

3

あなたが直面している問題は、リストを繰り返し処理しているときにリストからアイテムを削除しようとしているということだと思います。

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

議論のために、これが実際に問題であると仮定しましょう。また、反復中にリストからアイテムを削除することは禁止されていると仮定しましょう。

反復処理中にリストから項目を削除する必要がないようにするには、どうすればよいでしょうか? あなたはProject Eulerをやっているので、あなたが率直に答えてほしいかどうかわからないので、明白な答えを差し控えます。

于 2011-06-30T20:43:27.473 に答える
1

これを簡単に見ただけですが、反復しているコレクションを変更しているように見えます。つまり、アイテムを削除すると、現在のアイテム/次のアイテムへのポインターが影響を受け、最初のパススルーで特定のアイテムがスキップされる場合があります。

于 2011-06-30T20:43:30.293 に答える
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

リストから奇数番号のエントリを削除する必要がない理由がわかりません。偶数のものを追加するだけです。

于 2011-06-30T20:58:37.893 に答える
0

フィボナッチ数列の 3 項ごとに偶数であることを確認するのは難しくありません。代わりにそれを使用できます。

いずれにせよ、シーケンスを反復しながらシーケンスを変更するという古典的なトラップに陥りました。それをしないで、これをしてください:

fibonacci_list[:] = [x for x in fibonacci_list if x%2==0]
于 2011-06-30T20:44:30.547 に答える