Рекурсивная функция, которая суммирует нечетные цифры целого числа - PullRequest
0 голосов
/ 13 декабря 2010

Например, n = 8135267 => 16 Вот решение, но я его не понимаю.

int sumOddDigits(int n) {

if(n == 0)
   return 0;

if(n%2 == 1) //if n is odd
   //returns last digit of n + sumOddDigits(n/10) => n/10 removes the last digit of n
   return n % 10 + sumOddDigits(n/10) 

else
   return sumOddDigits(n/10); 

}

Ответы [ 4 ]

2 голосов
/ 13 декабря 2010

Целочисленное деление на десять «обрезает» последнюю цифру: Т.е. 1234/10 приводит к 123.

По модулю 10 возвращается последняя цифра: т.е. 1234%10 приводит к 4.

Таким образом, приведенный выше код всегда учитывает последнюю цифру.Если последняя цифра нечетная (отсюда %2==1), она будет засчитана, иначе нет.Таким образом, если он должен посчитать цифру, он берет последнюю цифру (% 10 -материал) и продолжает вычисление с остальными цифрами (рекурсия с /10 -материалом) и добавляет их к цифре.Если текущая цифра не должна быть подсчитана, она продолжается только с оставшимися цифрами (таким образом, рекурсией и /10 -материалом) без добавления ее к текущей цифре.

Если аргумент равен 0, это означает, чточто пройдено целое число, функция завершается возвратом 0.

1 голос
/ 13 декабря 2010

% - это оператор по модулю . Это в основном находит остаток от деления на число.

n% 2 n только 1, если это нечетно. % 10 получает остаток от деления числа на 10, то есть последнюю последнюю цифру. Целочисленное деление на 10 возвращает следующую цифру в качестве текущей последней цифры (1567/10 = 156)

0 голосов
/ 13 декабря 2010

Думайте об этом так. Если вы получаете четную цифру, ваша функция возвращает ее + значение функции числа без этой цифры. В противном случае он возвращает значение функции числа без последней цифры. На вашем примере:

813526(7) -> 0 + sumEvenDigits(813526)
                       6 + sumEvenDigits(81352)
                                 2 + sumEvenDigits(8135)
                                          ....
                                            8 + sumEvenDigits(0)
                                                      0 = 16

Надеюсь, это поможет.

0 голосов
/ 13 декабря 2010

Подумайте об этом так: начиная с вашего известного ответа 8135267 => 16, если бы я спросил вас о сумме нечетных цифр в * 3 * 8135267, что бы вас делать? Что если я попросил * 4 * 8135267? Как ваши ручные шаги связаны с этой функцией?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...