2016-05-22 3 views
1

は私のコードです:私は私がしなければならないと思う何再帰的なフィボナッチシーケンスが4,000,000を超える値を生成しないようにするにはどうすればよいですか?ここ

public class EvenFibonacciNumbers { 
//0 1 1 2 3 5 8 13 21 34 
    public static void main(String args[]){ 
     int index = 0; 
     while (true){ 
      System.out.println(fibonacci(index)); 
      index++; 
     } 
    } 
    public static long fibonacci(int i){ //i is our index value 
     //We will do this by recursion. 
     //We know that if our index is 0, it will return 0. 
     if(i == 0) return 0; 
     //We know that if our index is 1 or 2, it will return 1. 
     if (i <= 2) return 1; 
     //Now we need to determine what would happen if our index is greater 
     //than 2. 
     long fibTerm = fibonacci(i-1)+fibonacci(i-2); 
     return fibTerm; 
    } 
} 

は、私がこれを行うとき、私はそれが変数を見つけることができないことを私に言って、エラーを取得し、しかし

while (fibTerm<4000000) 

に変更していますfibTerm。だから、これはこれを行うには間違った方法でしょうか?私は正確にはわからない。

+0

次のうちのいずれか:**できません。再帰的なフィボナッチ計算機は 'O(n^2)'のランタイムを持ちます。これは大きな 'n'に対して計算全体を極端に遅くします。この問題は、線形に簡単に解決できます。加えて、線形アプローチは、かなり多くの上限を導入することを単純化するだろう。 – Paul

+0

@Paul反復はもっと現実的なアプローチでしょうか? –

+0

はい。メモリの必要量ははるかに少なく、再帰的なメソッドコールもありません。終了するのに必要な時間の点で効率的な実行方法であり、コードの理解には影響しません。 – Paul

答えて

5

ローカル変数fibtermを追加して計算の最終結果を保存し、結果が制限値4000000を超えているかどうかを確認し、結果を出力します。

public static void main(String args[]){ 
    int index = 0; 
    long fibterm = 0; 
    while ((fibterm = fibonacci(index++)) < 4000000){ 
     System.out.println(fibterm); 
    } 
} 
+0

これを行うと、フィボナッチ(インデックス)をintにキャストすることが強制されます。私はそれを実行すると、私は0のリストを取得します。 –

+0

私がこれを実行すると、それが私に与えられる最後の値はなぜですか:5702887?その値を返す前にこれを止めてはいけませんか? –

+0

ありがとうございます。意味あり。 –

関連する問題