Member 13502303 Ответов: 2

(Java) задача с алгоритмом рекурсии - квадратные корни


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


Мой код до сих пор:

public class Babylon{

    double sqrt( final double x, final int n ) {

        double s;

        if ( n == 0 ) {
            return x;
        }



        else {
            s=sqrt(0.5*(x+x/x),n-1); // I guess that the error must be here
            return 0.5*(s+x/s);
        }
    }       

public static void main (String[] args) {

    Babylon t = new Babylon();

    t.sqrt(10,8); // That is for testing reasons.


}
}   


Что я уже пробовал:

Я попробовал это с помощью "s=sqrt(0.5*(s+x/x),n-1)"; и все вариации формулы. Также попытался поставить "sqrt" сразу после заявления о возврате.

2 Ответов

Рейтинг:
7

Patrice T

Я не знаю, что ты пытаешься сделать, но ... :
x/x равно 1, и (x+x/x) является x+1
Угадайте, что вы хотите использовать Вавилонский метод, вам нужно отслеживать квадратный корень, который вы ищете, и его текущую оценку.
Методы вычисления квадратных корней - Википедия[^]

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Member 13502303

Спасибо за ваш ответ. Да, вы правы. Смысл в том, чтобы использовать Вавилонский метод для вычисления квадратных корней.

Кроме того, я не уверен, что отладчик может помочь мне решить эту проблему. Я уже знаю, что некоторые странные "s" будут возвращены функцией. Я просто не знаю, как мне написать код по-другому, чтобы он работал так::

квадратный корень x =

Оценка 1: 0.5 * (s(0) + x / (s0)) = 0.5*(x+1)

Оценка 2: 0.5 * (0.5*(x+1) + x / (0.5*(x+1)))

.
.
.

Patrice T

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

Отладчик позволяет вам видеть, что делает код.

Member 13502303

Я воспользовался ссылкой и попробовал ее. Это совсем не помогло. И все же спасибо, что помог мне.

Patrice T

Возьмите лист бумаги, карандаш и решите задачу вручную.
перечитывайте ссылку, пока не поймете, что вы делаете.

Member 13502303

Вот чем я занимаюсь уже почти неделю. Я (думаю, что я) понимаю алгоритм, но не могу его реализовать.

Суть в том, чтобы добраться до s_n. Чем s_n вставить в s_(n-1). Чем s_(n-1) в s_(n-2) и так далее. => какая - то формула, например f(s)

И, наконец, x = 0.5*(f(s) + x / f(s))

Patrice T

если вы хотите sqrt 125348, вам нужно 125348 на каждой итерации, всегда
Проверьте с помощью отладчика.

Рейтинг:
16

Kenneth Haugland

Вам нужно сделать что-то вроде этого:

double sqrt(double S, double x, double n)
{

    if (n == 0)
        return x;
    else
        return sqrt(S,0.5*(x+S/x), n - 1);

}
S никогда не изменится, так как это число вы хотите получить квадратный корень из него, в то время как x будет меняться. И вы должны угадать начальное значение x, чтобы начать с которого не может быть ноль, скажем 0.1, так что вызов может быть таким:
x_n = sqrt(S, 0.1, 10);
Если вы думаете об этом вы пытаетесь найти когда x^2 = S, и мы знаем, что когда x = sqrt(S) тот S/x = x, уитч, в свою очередь, означает, что 0.5*(x+S/x) = x.