[英]Finding the Square Root with recursion in Java
我必须编写一个程序,该程序返回输入的任何数字的平方根。 我的方法对于具有完美平方(例如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;
谢谢您的帮助!
这与无限循环中陷入的牛顿拉夫森迭代问题相同,我给出的答案几乎相同。
应该是(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))
在接近sqrt(number)
之前将变得低于tol
。 再次使用<tol*number
将解决此问题。 通过使用(Math.abs((Math.pow(approx,2) - number))<= tol*number)
,测试的右侧和左侧具有兼容的单位,因为公差是无量纲的。
如果不能解决堆栈溢出问题,请增加tol
或添加一个计数器以及最大数量的递归调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.