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

时间:2015-03-02 20:32:22

标签: java recursion square-root

我必须编写一个程序来返回输入的任何数字的平方根。对于任何具有完美正方形(如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; 

感谢您的帮助!

1 个答案:

答案 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或添加计数器和最大递归调用次数。