#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
, когда он слишком большой (или слишком маленький) и вызывает aStackOverflowError
.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) .