Нахождение корней уравнения методом деления отрезка пополам, используя рекурсию (Java)

Нужно решить уравнение x^3 - 3.5x^2 + 0.5x + 5 = 0 методом деления отрезка пополам, используя рекурсию.

Дан вот этот кусок кода, где автор учебника использует while:

public static double x_div2(double a, double b, double e) {
    while (b - a > e) { 
        double c = (a + b) / 2;
        if (f(a) * f(c) < 0) 
            b = c; 
        else if(f(a) * f(c) > 0) 
            a = c;
        else 
            return c;
    }
    return (a + b) / 2; 
}

Мои попытки привели меня к такому варианту:

public static double x_div(double a, double b, double e) {
    double c = (a + b) / 2;
    if (b - a <= e) {
        return c;
    }
    if (b - a > e) {  
        if (f(a) * f(c) < 0) 
            b = c; 
        else if (f(a) * f(c) > 0) 
            a = c;
        else 
            return c;
    }
    return x_div(a, c, e); 
}

Но, как можно заметить, в рекурсии я использую только переменную а (то есть теряю смысл деления отрезка пополам, ибо в любом случае использую левую половину), но это единственный более-менее рабочий вариант. Я пыталась ввести новую переменную, которая бы заменила а в первом случае и b во втором, но ничего из этого не вышло.


Ответы (1 шт):

Автор решения: Harry

Вроде бы так, нет?

public static double x_div(double a, double b, double e)
{
    double c=(a+b)/2;
    if (b-a <= e) return c;

    if (f(a)*f(c) < 0) return x_div(a,c,e);
    else if (f(a)*f(c) > 0) return x_div(c,b,e);
    else return c;
}

Правда, можно еще передавать и значения (или хотя бы знаки) функций в крайних точках, чтоб меньше считать. Да и саму функцию передаватькак параметр...

Ну, и считаем, что все предусловия при первом вызове выполнены (b>a, f(a)*f(b)<0).

→ Ссылка