1

プロジェクトオイラーの問題2で問題が発生しました。目的は、値が400万を超えないフィボナッチ数列の偶数の項の合計を見つけることです。何らかの理由で、出力として0を取得し続けます。私は何が間違っているのですか?

total = 0
count = 0
term = 0
fibonacciMemo = {0:0, 1:1}

def main ():
    term = fibonacci (count)
    while (term <= 4000000):
        if (term % 2 == 0):
            total += term
        count += 1

def fibonacci (n):
    if not n in fibonacciMemo:
        fibonacciMemo [n] = fibonacci (n - 1) + fibonacci (n - 2)
    return fibonacciMemo [n]

print (total)
4

3 に答える 3

6

いくつかの問題:

  • 関数を呼び出すことはありませんmain。実行するには、明示的に呼び出す必要があります。

  • term変数、counttotalinへの割り当てmainは、グローバル変数には書き込まれません。代わりに、同じ名前の個別のローカル変数が作成され、グローバル変数はが呼び出された0後でも値を保持します。main

    これを修正する 1 つの方法は、 に行を追加することglobal term, count, totalですmain。しかし、これは悪い設計です。mainグローバル変数を削除して (それらをすべて に対してローカルにする)、mainの値を返す方がはるかに優れていますtotal。その後print(main())、結果が表示されます。

  • 呼び出すfibonacciのは 1 回だけmainです。これをループ内に配置する必要があります。termそうしないと、が更新されないため、ループが無限に実行されます。

于 2012-04-19T16:29:14.000 に答える
4

これは、main または fibonacci を呼び出すことがないためです。割り当てるだけ

total = 0
count = 0
term = 0
fibonacciMemo = {0:0, 1:1}

その後

print (total)

を実行したい場合は、明示的にmain呼び出す必要があります。main()print (total)

コードに別の問題があります。関数内からグローバル変数をインクリメントしようとしてtotalいます。この関数に合計globalを宣言しない限り、それは機能しません。これを行うにglobal totalは、total を最初に使用する前に関数を挿入します。count と term についても同じ問題があります。また、制御フローにも問題があるようです。これでは正しい答えは得られません。

于 2012-04-19T16:28:14.937 に答える
2

スクリプトの最後に次の行を追加します。

if __name__ == "__main__":
    main()

main()これは、ファイルをPythonスクリプトとして実行するときに呼び出されます。

ところで、プロジェクトオイラーの問題にははるかに優れた解決策があります。フィルタリングする代わりに、フィボナッチ項を直接生成することもできます。今すぐスマートな解決策を探す習慣をつけてください。そうしないと、問題が困難になったときに壁にぶつかることになります。

于 2012-04-19T16:34:38.910 に答える