Тернарный оператор - упражнение. Я не понял, как работает счетная механика - требуется подробное объяснение - PullRequest
0 голосов
/ 01 августа 2020

Заранее благодарю за ваше время и помощь. Упражнение: напишите код для sumDigitsInNumber (целое число). Метод принимает целое число триди git. Вам нужно вычислить сумму цифр этого числа, а затем вернуть результат.

Рассмотрим этот пример: метод sumDigitsInNumber вызывается с аргументом 546.

Пример вывода: 15

КОД:

   public class Solution {
   
   public static void main(String[] args) {
   
   System.out.println(sumDigitsInNumber(546));
   }

   public static int sumDigitsInNumber(int number) {

   return number ==0? 0:number%10+sumDigitsInNumber(number/10);
   }
  }

Это решение и задача выполнена. Проблема в том, что решение было реализовано кем-то (не мной), поэтому я не могу понять, как эта функция выполняет свою работу. и вот результат:

number%10 = 546%10;
546/10 = 54;

вывод:

6+sumDigitsInNumber(546/10) - which is totally wrong.

Я не понимаю, КАК sumDigitsInNumber обрабатывается там тернарным оператором и как эта короткая строка кода:

return number ==0? 0:number%10+sumDigitsInNumber(number/10); 

производит такие сложные вычисления?

Может ли кто-нибудь объяснить это мне так, как это объяснило бы Java -ребенку? TYVM заранее.

1 Ответ

1 голос
/ 01 августа 2020

Итак, используя пример номер 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
...