2016-09-09 3 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

Спасибо, но проблема в том, что мне нужно использовать определенную формулу: , если n = 1 | | n = 2 print 1 , если n> 2 && нечетно: f ((n + 1)/2)^2 + f ((n-1)/2)^2 : f (n/2 + 1)^2 - f (n/2-1)^2 –