2017-03-08 7 views
0

フィボナッチシリーズは0 1 1 2 3 5 8 ...などです。スワップ要素を使用して表示できますが、配列を使用して取得できます。私たちはここに複雑さが増加しているので、それは大きな数のスタックのための問題を発生さフィボナッチ数を見つける最良の方法

int fib(int n){ 
if(n<1) 
    return 1; 
else 
    return fib(n-1)+fib(n-2);} 

、それはそれのためのインタビューで再帰とメインロジックを使用して見つけるように頼まれました。では、ここで最適な方法は何ですか?

+0

有効なJavaコードを投稿するか、タグを変更してください –

+0

@LuisMuñozこのコードは、私のJavaプログラムのメソッドです。 javaに関してそのメソッドで無効なものは何ですか? –

+1

コードを大量に実行できるようにする標準的な方法は、Javaで実装するのには簡単なmemoization(https://en.wikipedia.org/wiki/Memoization)を使用することです。しかし、フィボナッチ数は非常に速く大きくなるので、int型が持つことができる問題にすばやくぶつかります。したがって、おそらく大きな整数に切り替えるべきです。別の考え方は、再帰ヘルパー関数が2つの連続したフィボナッチ数の* pairs *を返すようにすることです - これは主要な問題である二重再帰を排除します。 –

答えて

1

Memoization。それぞれの麻痺を1回だけ計算するロジックを作成します。

static BigInteger[] fibNumbs = new BigInteger[10000]; 


public static void main(String[] args) { 
     fibNumbs[1] = BigInteger.ONE; 
     fibNumbs[2] = BigInteger.ONE; 
     System.out.println(fibOf(10000)); 
    } 

public static BigInteger fibOf(int n) { 
     if (n <= 1) { 
      return BigInteger.ONE; 
     } 

     if (fibNumbs[n - 1]==null) { 
      fibNumbs[n - 1] = fibOf(n - 1); 
     } 

     if (fibNumbs[n - 2]==null) { 
      fibNumbs[n - 2] = fibOf(n - 2); 
     } 

     return fibNumbs[n - 1].add(fibNumbs[n - 2]); 
    } 
+0

私はこれを知っています。私はコード形式でそれをしたい。 fib(n-1)が次の呼び出しでfib(n-2)を計算するfib(n-1)とfib(n-2)の加算を戻しているのを見てください。 。そのため、複雑さが軽減されます。配列の三項演算子は助けることができますが、私はより良い方法を期待しています。 –

0

もし私があなたに2つの連続したフィボナッチ数、例えば、 a=3b=5、あなたは次を推測できますか? 2つの合計は8です。今度はa=5と新しく計算された数字b=8であなたは次を計算できますか?あなたは2つの最初の01の2つの反復を開始し、カウントダウンする回数のインデックスを表示します。ゼロになると、aが答えになります。これはO(n)アルゴリズムです。

+0

はい、ループとO(n)の配列を1つだけ歌うことができます。しかし、私の要件は、前述のように複雑さの少ない再帰を使用するソリューションです。再帰を使用することはスタック管理の習慣としては悪いことですが、私はこれを知っていますが、最適化されたアルゴリズムをチェックするためにこれを解決するよう依頼されました。 –

+0

@RajeshNavagareループと再帰関数の違いはありません。その再帰呼び出しが末尾にあり、言語がテールコールの最適化をサポートしている場合です。多くの言語は、例えば。 GNUのC++への拡張。アルゴリズムは、値を再帰呼び出しに更新する変数を更新するのではなく、変数が本質的にバインドされた引数であるだけで同じです。 – Sylwester

関連する問題