我必须编写一个程序来返回输入的任何数字的平方根。对于任何具有完美正方形(如25或100)的数字,我的方法运行正常,但如果我使用任何不是(3或10)的数字,我会得到堆栈溢出错误。我希望有人可以告诉我我做错了什么以及如何解决它。
public boolean sqrRootRecursive(int number, double approx, double tol)
{
if( (Math.abs((Math.pow(approx,2) - number))<= tol))
{
System.out.println("The root is " +approx);
}else if (Math.abs((Math.pow(approx,2)-number))>tol)
{
sqrRootRecursive(number, ((Math.pow(approx,2)+number)/(2*approx)), tol);
}
return true;
感谢您的帮助!
答案 0 :(得分:2)
与Newton Raphson iteration trapped in infinite loop同样的问题,我给的答案几乎相同。
应为(Math.abs((Math.pow(approx,2) - number))<= tol*number)
Math.abs((Math.pow(approx,2) - number))
几乎不会低于tol
。它可能对某些数字起作用而对其他数字则失败,这与问题中描述的症状相对应。正确的测试是<tol*number
。number
非常小,Math.abs((Math.pow(approx,2) - number))
会在接近tol
之前低于sqrt(number)
。再一次,使用<tol*number
将解决此问题。通过使用(Math.abs((Math.pow(approx,2) - number))<= tol*number)
,测试的右侧和左侧具有兼容的单位,因为公差是无量纲的。
如果它没有解决堆栈溢出,请增加tol
或添加计数器和最大递归调用次数。