0

これはプロジェクトオイラーの問題2からのものです。私は次の一見無害なコードを書きました。

public class FibonacciEven {
    public static void main(String[] stuff) {
        long sum = 0;
        int i = 0;
        while(fib(i) <= 40) {
            boolean even = fib(i) % 2 == 0;
            if(even) {
                sum += fib(i);
            }
            else {
                continue;
            }
            i++;
        }
        System.out.println(sum);
    }
    public static long fib(int n) {
        long prev1 = 0;
        long prev2 = 1;
        for(int i = 0; i < n; i++) {
            long savePrev1 = prev1;
            prev1 = prev2;
            prev2 = savePrev1 + prev2;
        }
        return prev1;
    }
}

フィボナッチ数を計算するためのJavaメソッドがどのようにメモリを大量に消費するかについて読んだことがありますが、ご覧のとおり、制限を40に縮小しましたが、まだ終わりに達していないので、いくつかの構文がひどく間違っています。コードのどの部分がそれを永久に実行させていますか?そして、これらすべてが本当にメソッドの実行に非常に時間がかかるという事実によるものである場合、誰かがより良い方法を提案できますか?

編集:わかりました、今私のコードは次のようになります:

public class FibonacciEven {
    public static void main(String[] stuff) {
        long sum = 0;
        int i = 0;
        while(fib(i) <= 40) {
            boolean even = fib(i) % 2 == 0;
            if(even) {
                sum += fib(i);
            }
            i++;
        }
        System.out.println(sum);
    }
    public static long fib(int n) {
        long prev1 = 0;
        long prev2 = 1;
        for(int i = 0; i < n; i++) {
            long savePrev1 = prev1;
            prev1 = prev2;
            prev2 = savePrev1 + prev2;
        }
        return prev1;
    }
}

今回は、フィボナッチ数列の2(インデックス3)を無視します。

4

4 に答える 4

5

falseの場合even、更新せずにcontinuinにiなります。そのため、再度ループし、まったく同じ作業を再度実行するため、evenfalseになります。

elseブロックを取り出したいだけだと思います。

于 2012-06-21T19:18:58.387 に答える
2

また、毎回多くの作業をやり直しています。以前に計算された値を持っているので、メモ化することをお勧めします。それと再帰はここでのあなたの友達です。

ここに画像の説明を入力してください

これは、毎回ループするよりもはるかに効率的だと思います。

于 2012-06-21T19:22:45.850 に答える
0

あなたはいつでもはるかに効率的な方法で数を計算しようとすることができます。これを行う方法についての非常に良い説明があります:http O(nlogn)//blog.codility.com/2012/03/omicron-2012-codility-programming.html

(このリンクの問題ははるかに複雑ですが、Fibbonacci数の計算方法は同じです)

于 2012-06-21T19:22:20.847 に答える
-3

問題は最初はi=0の場合で、ブール値がfalseを返し、else部分を実行していると思います。if
またはelseの両方でi値をインクリメントしてみてください。

if(even) {
            sum += fib(i);
i++;
        }
        else {
      continue;
  i++;
      }
于 2012-06-21T19:22:56.723 に答える