2016-09-09 8 views
0

StackOverflowErrorの理由は何ですか?私はしばらくそれを試していたが、それがなぜ起こるのか、それを修正する方法はまだ得られない。スレッド "main"の例外の修正java.lang.StackOverflowError

コードで使用されている式が必要です。

public static long fib(long n){ 
    if(n == 1 || n == 2) 
     return 1;  
    else if(n > 2 && n%2 == 0)//even 

     return fib((n/2+1)*(n/2+1)) - fib((n/2-1)*(n/2-1)); 

    else //odd 

     return fib(((n+1)/2)*((n+1)/2)) + fib(((n-1)/2)*((n-1)/2)); 

} 

public static void main(String[] args){ 

    for(int i = 1; i <= 10; i++) 
     System.out.println(fib(i)+" "); 

} 
+0

あなたがフィボナッチルーチン作業している:あなたのコードと「嘘」メソッド名を起動する方法については

は、それはあなたが簡単な方法で行うことができフィボナッチを実行しようとしているように見えますここでは、これは(どちらかでも有限再帰)、無限再帰を使用していません:あなたは無限の取得http://stackoverflow.com/questions/29530090/iteral-fibonacci-java-code-returns-0-when-fibonacci-sequence-2 –

+2

再帰は '((n + 1)/ 2)*((n + 1)/ 2)> nのため再帰です。 –

答えて

0

そうでもない、あなたの方法で達成しようとしているが、ちょうどあなたのコードにいくつかのSystem.out.printlnを追加することによって、あなたは、各再帰呼び出しになっているかを見ることができるものを確認してください。あなたの "奇妙な"呼び出しが無限ループに陥っているのを見ると、その理由はStackOverflowErrorエラーです。これは通常、再帰関数が正しい終了条件を持たない場合、つまり終了します永遠に自分自身を呼び出す。

public static int getFibonacci(int n) { 
if (n == 1) { 
    return 1; 
} 
if (n == 2) { 
    return 1; 
} 
return getFibonacci(n - 1) + getFibonacci(n - 2); 
} 
+0

ありがとうございますが、問題は特定の数式を使用する必要があるということです。 | f((n + 1)/ 2)^ 2 + f((n-1)/ 2)^ 2 even:f(n/2 + 1)^ 2 print 1 2-f(n/2-1)^ 2 –

関連する問題