Я не понимаю рекрутские методы

#java #methods

#java #методы

Вопрос:

 
    public static double calculatePower (double x, int y) {
        if (y == 0) 
           return 1;
        else 
           return (int) calculatePower(x, y-1);

  

Я понимаю, как вызывается рекрутинговая функция, но не то, как она отменяется.

Я думаю, если в какой-то момент y=1 функция должна return 1 из-за if оператора. Но это не так, и я не понимаю, почему

Комментарии:

1. В этом нет ничего большего, чем вы уже сказали. Я рекомендую вам вручную выполнить функцию, используя ручку и лист бумаги, отслеживая текущее значение x и y , и оценивайте, скажем, calculatePower(5, 3) .

2. Этот метод всегда будет возвращать 1, за исключением случаев y , когда он слишком большой (или слишком маленький) и вызывает a StackOverflowError .

3. да, извините, я забыл * x в конце инструкции return

Ответ №1:

Для каждого рекурсивного вызова входящий y параметр уменьшается на единицу с момента написания calculatePower(x, y-1); . В какой-то момент y это 0 происходит, и рекурсия останавливается.

Обратите внимание, что ваш расчет мощности неверен, вы должны добавить a x * перед фактическим рекурсивным вызовом: x * calculatePower(x, y-1)

Комментарии:

1. Я хотел бы выделить вторую часть вашего ответа. Эта ошибка в операционном коде является основной причиной непонимания рекурсии

2. «В какой-то момент y это 0 происходит, и рекурсия останавливается». Ну, об этом … здесь предполагается, что y это положительное целое число, но это не применяется. Возможно, вы захотите добавить это в качестве примечания.

Ответ №2:

Это будет вычитать 1 из y каждый раз, когда оно выполняется.

Я рекомендую вам выполнить это вручную на бумаге, чтобы увидеть, как работает программа.

пример: calculatepower(2,3) -> calculatepower(2,2) -> calculatepower(2,1) -> calculatepower(2,0). Теперь, поскольку y = 0, оператор if будет выполнен, и он вернет 1

Ваша функция вернет только значение 1 (если y было положительным числом)

Этот урок YouTube даст вам четкое объяснение рекурсии: https://www.youtube.com/watch ?v=neuDuf_i8Sg

Комментарии:

1. Но где Java хранит значение return ? неявно вы должны использовать переменную x и умножать все значения (с циклом while или for) на …{ x *= x } возвращает x; эти значения будут сохранены в x, но я не понимаю возврата.

2. попробуйте запустить следующий код и посмотреть, что произойдет int x = calculatepower(2,3); System.out.println(x); Примечание: замените код, который у вас есть в состоянии else, следующим: return (int) x * calculatePower(x, y-1) .