Нахождение корней уравнения методом деления отрезка пополам, используя рекурсию (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 шт):
Вроде бы так, нет?
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).