2016-04-15 7 views
1

フィボナッチを少し修正しました。ダイナミックプログラミングを使用するフィボナッチ

ここ

n = (n-1)^2 + (n-2)

ここに私のコードだ、

public static int fibonacci(int first, int second, int n){ 
    int[] memo = new int[n + 1]; 
    for(int i=0; i<= n; i++){ 
     memo[i] = -1; 
    } 
    return fibonacci(first, second, n, memo); 

} 

public static int fibonacci(int first, int second, int n, int[] memo){ 
    if(n == first || n == second) return n; 

    if(memo[n] < 0) memo[n] = (int)Math.pow(fibonacci(first, second, n-1, memo), 2) + fibonacci(first, second, n-2, memo); 

    return memo[n]; 
} 

私が上で、それをデバッグする数回試してみたが、問題がどこにあるかを見つけ出すように見えることはできません。このコードは次の数値を生成し、F(5)に対してF(6)を生成します。どんな助けもありがたい。 私はこの問題を対話的に解決できますが、それは私がやろうとしていることではありません。私はこのDP手法を使ってやりたいと思っています。

+1

はあなたの問題が何であるかをより具体的には、あなたの質問を編集することができます。あなたが得るものと実際に得られるものの例を提供してください。 – buczek

+0

より理解しやすいようにコードにいくつかのコメントを入れてください –

答えて

2

コードに論理エラーがあります。

firstおよびsecondは、シーケンスの最初と2番目の用語の値です。nは、検索したい値のインデックスです。

if(n == first){ 
     return memo[n] = first; 

    } 
    if(n == second) return memo[n] = second; 

はそれがあるべき:しかし、ここで、あなたは間違っているインデックスと値を比較

if(n == 1){ 
     return memo[n] = first; 

    } 
    if(n == 2) return memo[n] = second; 
+0

私はフィンドナッチ関数をデクリメントされたインデックスで再帰的に呼び出すためです。 – Zeus

+0

いずれにしても、私は自分のコードを修正しました。 – Zeus

+0

@ Zeusあなたのコードは 'first'と' second'が常に0と1に等しい場合にのみ正しいです。もしそうなら、どうしてそれらを渡す必要がありますか?たとえば、 'first = -1'と' second = 3'の場合、あなたのコードは正しいですか? –

関連する問題