Итак, используя пример номер 546, давайте пройдемся по коду.
При первом запуске он действительно возвращает 6+sumDigitsInNumber(546/10)
, это все правильно.
Потому что * Параметр (число) 1006 * - int, десятичная часть деления усекается, что приводит к операции минимума (принудительное округление в меньшую сторону). И мы рекурсивно вызываем sumDigitsInNumber
, поэтому мы просто продолжаем «зацикливать» этот участок кода. Таким образом, для второго запуска это эквивалентно sumDigitsInNumber(54)
плюс дополнительные 6 из первого запуска (6+sumDigitsInNumber(54)
).
Второй вызов возвращает 4+sumDigitsInNumber(54/10)
, следуя тому же logi c, что и первый звонок. Это эквивалентно 4+sumDigitsInNumber(5)
.
Затем мы снова запускаем весь процесс, который возвращает 5+sumDigitsInNumber(5/10)
, что эквивалентно 5+sumDigitsInNumber(0)
.
Последний вызов, sumDigitsInNumber(0)
, вернет 0 из-за тернарного оператора в операторе возврата.
Чтобы развернуть все это:
sumDigitsInNumber(546)
= 6+sumDigitsInNumber(546/10) = 6+sumDigitsInNumber(54)
= 6+(4+sumDigitsInNumber(54/10)) = 6+(4+sumDigitsInNumber(5))
= 6+(4+(5+sumDigitsInNumber(5/10))) = 6+(4+(5+sumDigitsInNumber(0)))
= 6+(4+(5+0))
= 6+(4+(5))
= 6+(9)
= 15