Java递归根函数

时间:2015-04-17 01:31:43

标签: java recursion

我写了一个函数在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的初始值。

1 个答案:

答案 0 :(得分:3)

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;
}