stackoverflow错误递归平方根

时间:2016-03-16 01:05:28

标签: java recursion

运行程序时出现stackoverflow错误。我对java很了解,我可以使用一些建议。

感谢任何帮助!

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

2 个答案:

答案 0 :(得分:0)

正如评论中所述,请研究StackOverflowError是什么,但无论如何,我都会指出你遇到问题的地方。对于递归计算,下一个估算值计算如下:

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

但是,对于迭代情况,有:

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

请注意,这两个近似值不相等,所以虽然我没有检查数学,但是如果你使用sqrRootRec函数使用第二种形式,它应该解决StackOverflowError

答案 1 :(得分: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

那是完全不同的。修正括号[()]的位置,你会没事的。