3

次のコードが期待される出力を生成しない理由を理解するのに苦労しています。代わりに、result = 272 は正しくないようです。

/*
 *Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
 *Find the sum of all the even-valued terms in the sequence which do not exceed four million.
 */

public class Fibonacci 
{
    public static void main (String[] args)
    {
        int result = 0;
        for(int i=2;i<=33;i++)
        {
            System.out.println("i:" + fib(i)); 
            if(i % 2 == 0) //if i is even 
            {
                result += i;
                System.out.println("result:" + result); 
            }
        }
    }   
    public static long fib(int n)
    {
        if (n <= 1)
            return n;
        else
            return fib(n-1) + fib(n-2);
    }
}    
4

3 に答える 3

5

この行は にフィボナッチ数をresult += i;追加しません。 result

にフィボナッチ数を追加する方法を理解できるはずですresult

ヒント: 操作しようとしている数値を格納する変数を作成することを検討してください。

于 2010-11-14T23:45:56.433 に答える
1

まず第一に、Fib に関して 1 つの問題がありました。Fib の定義はhttp://en.wikipedia.org/wiki/Fibonacci_numberにあります。

2 番目に (i % 2) は他のすべての数 (2、4、6 など) に当てはまります。これにより、fib(2)、fib(4) などに当てはまります。

そして最後に、 result += i がインデックスを追加します。追加したくないのは、fib(i) の結果です。したがって、最初に fib(i) を計算し、それを変数に格納し、それが偶数か奇数かを確認し、偶数の場合は変数を結果に追加する必要があります。

[編集]
最後のポイント: すべての数値を合計したくないときに再帰で fib を実行すると、非常に悪い場合があります。高い数値を処理している場合は、StackOverflowException が発生する可能性もあります。そのため、同じ数値を何度も計算する必要がないように、方法を検討することを常にお勧めします。この例では、数値を合計したいので、最初に fib(0)、次に fib(1) などを試す代わりに、リストを使用して途中のすべての数値をチェックし、それを条件に一致する場合の結果。

于 2010-11-14T23:51:06.640 に答える
0

これは良い出発点ですが、Java ではなく C です。それでも役立つかもしれません:リンクテキスト

于 2010-12-18T16:59:41.207 に答える