У меня проблемы с пониманием стека и порядка операций в java. Если бы у меня было следующее:
operation(7, 2)
public int operation(int x, int y) {
if (x == y)
return 0;
else
return operation(x – 1, y) + 2;
}
Что будет в результате? Мне сказали, что это должно быть одно число, но я не понимаю, как (x - 1, y) + 2 может быть одним числом. Я получил это:
(x – 1, y) + 2
(7 - 2, 2) + 2
(5, 2) + 2
Но я не понимаю, как добавить 2 в конце. Разве при этом не нужно было бы возвращать оба значения, разделенные запятой?
Рекурсивная формула - это 2*(x-y), где x >= y (не определено, если x <y)




Wouldn't this need to return both values separated by a comma?
Неа.
operation(x – 1, y) + 2 - это рекурсивная функция.
operation(7 - 1, 2) + 2 => operation(6, 2) + 2 Это вызывает функцию operation с аргументами 6 и 2 (аналогично тому, как вы выполняли первоначальный вызов). В конечном итоге этот вызов завершится номером, к которому добавляется и возвращается 2.
Взяв меньшее число для лучшей визуализации operation(4, 2)
operation(4, 2) -> return operation(3, 2) + 2
operation(3, 2) -> return operation(2, 2) + 2
operation(2, 2) -> return 0 (the base case)
.. stack unwinds
operation(3, 2) -> return 0 + 2
operation(4, 2) -> return 2 + 2
Спасибо. Рекурсивное программирование - это то, что мне трудно понять.
operatation(7, 2) returns -> 8 + 2 = 10
operatation(6, 2) returns -> 6 + 2 = 8
operatation(5, 2) returns -> 4 + 2 = 6
operatation(4, 2) returns -> 2 + 2 = 4
operatation(3, 2) returns -> 0 + 2 = 2
operatation(2, 2) returns -> 0
Рекурсивные вызовы будут выполняться до тех пор, пока значения x и y не станут равными, в этом случае operation вернет 0. Затем возвращаемое значение добавляется к 2 и возвращается вызывающему, то есть 0 + 2 = 2, и так далее, пока не будет возвращен первый вызывающий. Следовательно, ответ - 10.
Фактически, это примерно эквивалентно петле for. Этот код имеет тот же результат, что и operation(7, 2):
int equivOfOperation = 0;
for (int i = 2; i < 7; i++)
{
equivOfOperation += 2;
}
Рекурсивная функция в конечном итоге выполнит эквивалент
for (int i = y; i < x; i++)
при условии, конечно, что y < x. (В этом случае operation будет иметь бесконечную рекурсию).
Поскольку несколько других ответов уже показали след рекурсии, я не буду повторять это здесь, но вы можете пройти по их следам и убедить себя в том, что это имеет тот же эффект, что и цикл for.
Вы имеете в виду «однозначное число», а не «однозначное число»? Результат должен быть единственным числом, потому что результат - int. (Я тоже не понимаю, почему это будет однозначное число)