繁体   English   中英

stackoverflow错误递归平方根

[英]stackoverflow error recursion square root

我运行程序时收到stackoverflow错误。 我对Java非常了解,可以使用一些建议。

任何帮助表示赞赏!

public class ApproxSquareRoot {

public static float sqrRootRec(float number, float approx, float tol) {
    if((Math.abs((Math.pow(approx,2) - number))<= tol*number)) {
       return approx;
    } else
       return sqrRootRec(number, (approx*approx + number/(2*approx)),tol);


}

public static float sqrRoot(float number, float approx, float tol) {

     while (Math.abs((Math.pow(approx,2) - number))<= tol*number)
     approx = (approx*approx + number)/(approx + approx);
     return approx;
}

}

Input number: 43
Input approx: 2.5
Input tol: .1
Output with number = 43.0 approx = 2.5 tolerance = 0.1
Exception in thread "main" java.lang.StackOverflowError

正如评论中所述,请研究StackOverflowError是什么,但无论如何,我都会指出你遇到问题的地方。 对于递归计算,下一个估计值计算如下:

return sqrRootRec(number, (approx*approx + number/(2*approx)),tol);

但是,对于迭代情况,有:

approx = (approx*approx + number)/(approx + approx);

请注意,这两个近似值不相等,因此尽管我没有检查数学,但是如果您使sqrRootRec函数使用第二种形式,则它应该解决StackOverflowError

在您的迭代函数中,下一个迭代变为:

(approx*approx + number)/(approx + approx)

在您的递归函数中,它变为:

(approx*approx + number/(2*approx))

如您所见,括号是不同的。 您的递归函数可以写成:

(approx*approx + (number/(2*approx)))

对于迭代函数,在一次迭代后,该值变为:

(2.5 * 2.5 + 43) / (2.5 + 2.5) = 9.85

但是对于您的递归函数,它是:

(2.5 * 2.5 + (43 / (2 * 2.5))) = 14.85

那是完全不同的。 修正括号[ () ]的位置,你会没事的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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