1

Project Euler の質問をもう一度試みています。問題 2で、400 万未満のフィボナッチ数列のすべての偶数の合計を求めるよう求められています。以下のコードでは、While ループ (コード内のコメントとして示されています) を使用してそれを行うことができますが、for ループは使用しません (膨大な数が得られ、400 万を超える 'c' の方法が必要です.

ここで for ループが機能しないのはなぜですか?

ありがとう。

def fibo():
    z=[]
    a=1
    b=1
    c=0
    for c in range(0,4000000):    #doesn't work; works with while (c<4000000)
        c = a+b
        if c%2 == 0 and c<4000000:
            z.append(c)
        a=b
        b=c
        print c
    print 'sum is',sum(z)

fibo()
4

5 に答える 5

6

for ループは「いつ停止する」という意味ではありませんc == 4000000range(4000000)これは、「 0 から 3999999 までの数字のリストであるsequence を反復処理し、シーケンスcの各要素に設定してループ本体を 1 回実行する」ことを意味します。

于 2013-08-21T21:17:57.920 に答える
2

難しいのはrange()、リスト (または Python 3 のイテレータ) を返すことです。ループを通過するたびに、範囲から次の番号が取得されます。は何も探していないため、別の値を割り当ててcも何もしません。範囲から次の番号を取得して に入れるだけです。の値は、ループとはまったく関係ありません。forcccfor

反復子の値をリセットするために使用できる独自の反復子を作成できますsend()が、これを作成するのは少し難しいです。while ループを使用することもできます。

于 2013-08-21T21:22:14.470 に答える
1

3 番目のフィボナッチ数はすべて偶数であることに注意してください。これは帰納法で証明できます。また、フィボナッチ数は、特性多項式 x^2-x-1 を使用した再帰関係によって定義されます。つまり、c と d が特性多項式のゼロである閉形式の解 F_n = a*c^n + b*d^n を持っています。結果の恒等式は、Binet の公式としても知られています。詳しくはウィキペディアをご覧ください。

したがって、望ましい結果は 2 つの等比級数の合計です。ウィキペディアは幾何級数の閉形式を教えてくれます。

ポイントは、繰り返しなしで目的の結果を計算できることです。私の意見では、これがこの問題の本質です。

于 2013-08-21T21:28:57.820 に答える
1

c0 から 4M までの範囲全体を反復し、ループの各反復内で行った変更を吹き飛ばします。for私が考えることができる単純なループでは、これを実際に行うことはできません。

于 2013-08-21T21:16:46.833 に答える
0

cfor ループ内で 更新しています: c = a+b。別の変数を使用してください。

于 2013-08-21T21:16:46.680 に答える