Java递归根函数

标签 java recursion

我编写了一个函数来在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/

相关文章:

java - 在java中将日期格式从1-1-2012转换为2012年1月1日?

java - 当我将按钮放在 Activity 上时,Android 应用程序崩溃,空 Activity 正在工作

java - 如何使用流比较两个列表?

list - 如果嵌套列表有 1 个元素,如何删除 Scheme 中嵌套列表中的括号?

algorithm - 递归算法中的 Go channel 导致重复值

recursion - 易递归算法的迭代版本

java - AspectJ 可以将字段调用替换为 getter/setter 吗?

java - 是否可以对 List 进行超投?

python - 楼层划分的递归函数

c++ - 递归反转链表的函数