我编写了一个函数来在java中为给定函数查找根,它找到根就好了,但是当我返回根时,它返回我传递给函数的m的初始值,而不是最后一张。我在函数中添加了一堆打印语句,以确保达到该值,我的问题是如何将 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
返回一个 double 值。当您在方法中(递归地)调用它时,您不会对返回值执行任何操作:
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;
}
关于Java递归根函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29688693/