Порядок работы Java

У меня проблемы с пониманием стека и порядка операций в 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 в конце. Разве при этом не нужно было бы возвращать оба значения, разделенные запятой?

Вы имеете в виду «однозначное число», а не «однозначное число»? Результат должен быть единственным числом, потому что результат - int. (Я тоже не понимаю, почему это будет однозначное число)

Andy Turner 09.04.2018 18:14

Рекурсивная формула - это 2*(x-y), где x >= y (не определено, если x <y)

Ian Mc 09.04.2018 18:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
209
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

Спасибо. Рекурсивное программирование - это то, что мне трудно понять.

BrianStoiber 11.04.2018 17:04
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.

Другие вопросы по теме