【问题标题】:Finding the Square Root with recursion in Java在Java中使用递归查找平方根
【发布时间】:2015-03-02 20:32:22
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 什么是 approx 和 tol?
  • 不需要你的第二个if:如果(Math.abs((Math.pow(approx,2) - number))&lt;= tol)) 为假,那么肯定Math.abs((Math.pow(approx,2)-number))&gt;tol
  • 我不记得这个算法是如何工作到足以发现问题的,但我建议您在递归步骤之前添加一个调试行,以便您可以观察递归并尝试找到您的错误。
  • stackoverflow.com/questions/28781485/…一样的问题:应该是(Math.abs((Math.pow(approx,2) - number))&lt;= tol*number)
  • 如果@Soma Turi 在你的教室里......告诉他发现他的question:他认为将float 更改为double 解决了他的问题,但事实并非如此...

标签: java recursion square-root


【解决方案1】:

这与Newton Raphson iteration trapped in infinite loop 的问题相同,我给出的答案几乎相同。

应该是(Math.abs((Math.pow(approx,2) - number))&lt;= tol*number)

  • 如果数量很大,Math.abs((Math.pow(approx,2) - number)) 几乎不会低于tol,因为浮点计算的精度。它可能对某些数字有效,而对其他数字无效,这与问题中描述的症状相对应。正确的测试是&lt;tol*number
  • 如果number 非常小,Math.abs((Math.pow(approx,2) - number)) 在接近sqrt(number) 之前会低于tol。再一次,使用&lt;tol*number 将解决这个问题。

通过使用(Math.abs((Math.pow(approx,2) - number))&lt;= tol*number),测试的右侧和左侧具有兼容的单位,因为公差是无量纲的。

如果没有解决堆栈溢出,增加tol或者增加一个计数器和一个最大递归调用次数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2012-07-17
    相关资源
    最近更新 更多