簡體   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