繁体   English   中英

在Java中使用递归找到平方根

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM