运行程序时出现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
答案 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
那是完全不同的。修正括号[(
和)
]的位置,你会没事的。