2016-03-16 2 views
1

Я получаю ошибку stackoverflow при запуске моей программы. Я довольно хорошо знаю java, и я мог бы немного посоветоваться.stackoverflow ошибка рекурсия квадратный корень

Любая помощь приветствуется!

public class ApproxSquareRoot { 

public static float sqrRootRec(float number, float approx, float tol) { 
    if((Math.abs((Math.pow(approx,2) - number))<= tol*number)) { 
     return approx; 
    } else 
     return sqrRootRec(number, (approx*approx + number/(2*approx)),tol); 


} 

public static float sqrRoot(float number, float approx, float tol) { 

    while (Math.abs((Math.pow(approx,2) - number))<= tol*number) 
    approx = (approx*approx + number)/(approx + approx); 
    return approx; 
} 

} 

.

Input number: 43 
Input approx: 2.5 
Input tol: .1 
Output with number = 43.0 approx = 2.5 tolerance = 0.1 
Exception in thread "main" java.lang.StackOverflowError 
+0

Вы исследовали, что такое 'StackOverflowError'? – Ceelos

+0

Возможно, вы получаете бесконечную рекурсию. –

+0

@TimBiegeleisen, как я могу исправить это. Вы можете помочь? –

ответ

0

Как было отмечено в комментариях, пожалуйста, исследовать то, что StackOverflowError есть, но независимо от того, что я должен указать, где вы получаете проблему. Для вашего рекурсивного вычисления, следующая оценка рассчитывается следующим образом:

return sqrRootRec(number, (approx*approx + number/(2*approx)),tol); 

Однако для итерационных случае есть:

approx = (approx*approx + number)/(approx + approx); 

Обратите внимание, что эти два приближения не равны, так что, хотя я гавань Не проверял математику, если вы делаете свою функцию sqrRootRec, используйте вторую форму, она должна решить StackOverflowError.

+0

Большое спасибо! –

0

В вашей итеративной функции, следующая итерация становится:

(approx*approx + number)/(approx + approx) 

В вашей рекурсивной функции, она становится:

(approx*approx + number/(2*approx)) 

Как вы видите, круглые скобки различны. Ваша рекурсивная функция может быть записана в виде:

(approx*approx + (number/(2*approx))) 

Для итеративной функции, после одной итерации значение становится:

(2.5 * 2.5 + 43)/(2.5 + 2.5) = 9.85 

Но для рекурсивной функции является:

(2.5 * 2.5 + (43/(2 * 2.5))) = 14.85 

Это достаточно разный. Исправьте расположение скобок [( и )], и все будет в порядке.

+0

Благодарим вас за разъяснение! –