[英]Java recursive root function
我寫了一個函數來找到給定函數的java根,它找到根就很好,但是當我返回根時,它返回傳遞給函數的m的初始值,而不是最終值。 我在函數中添加了一堆print語句以確保已達到該值,這是我的問題是如何從函數中傳遞m的最新版本而不是舊版本? 我的代碼如下所示。
public static double bisect (double a, double b, double tolerance)
{
double m = (a+b)/2;
double q = 0;
while(q < tolerance){
if (m*m*m - 2.0*m - 3.0 == 0.0){
return m;
}
else if((a*a*a - 2.0*a - 3.0)*(m*m*m - 2.0*m - 3.0)<0){
q++;
System.out.printf("%1.15f %1.15f %1.15f\n",a,m,b);
b = m;
bisect(a,b,1.0e-10);
}
else if((b*b*b - 2.0*b - 3.0)*(m*m*m - 2.0*m - 3.0)<0){
q++;
System.out.printf("%1.15f %1.15f %1.15f\n",a,m,b);
a = m;
bisect(a,b,1.0e-10);
}
}
return m;
}
我的打印輸出看起來像這樣
1.000000000000000 1.500000000000000 2.000000000000000
1.500000000000000 1.750000000000000 2.000000000000000
1.893289196304497 1.893289196304498 1.893289196304499
我削減了數百步之間的距離,但是1.89是我想要達到的價值,那么我如何實現呢? 現在它返回1.5,這是我的m初始值。
bisect
返回一個雙bisect
值。 當您在方法中(遞歸)調用它時,您對返回值不做任何事情:
a = m;
bisect(a,b,1.0e-10);
您想要將m的值設置為返回值:
a = m;
m = bisect(a,b,1.0e-10);
您可以進一步簡化一下:
m = bisect(m, b, 1e-10);
當我弄清楚它做了什么時,我最終簡化了一點,這是我的簡化版本。 可能有用嗎?
public static double bisect(double a, double b, double tolerance) {
double m = (a + b) / 2;
double q = 0;
while (q < tolerance) {
if (m*m*m - 2*m - 3 == 0)
return m;
else if ((a*a*a - 2*a - 3) * (m*m*m - 2*m - 3) < 0)
m = bisect(a, m, 1.0e-10);
else if ((b*b*b - 2*b - 3) * (m*m*m - 2*m - 3) < 0)
m = bisect(m, b, 1e-10);
q++;
}
return m;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.