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