Форум программистов, компьютерный форум CyberForum.ru

Рекурсия: подсчет количества четных цифр числа (на С) - C++

Восстановить пароль Регистрация
 
Do6oDyH
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 71
18.04.2011, 14:43     Рекурсия: подсчет количества четных цифр числа (на С) #1
Написать рекурсивную функцию считывающую количество четных цифр числа.

Плохо понял рекурсию объясните на этом примере пожалуйста.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.04.2011, 15:27     Рекурсия: подсчет количества четных цифр числа (на С) #2
Эх, люблю я тернарный оператор)))

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
size_t count_even_digits(int);
 
int main(void)
{
    int number;
 
    printf("Enter number: ");
    scanf("%d", &number);
 
    printf("Count of even digits in number %d: %u\n", number, count_even_digits(number));
 
    return 0;
}
 
size_t count_even_digits(int number)
{
    return !number ? 0 : !(number & 1) + count_even_digits(number / 10);
}
Do6oDyH
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 71
18.04.2011, 15:33  [ТС]     Рекурсия: подсчет количества четных цифр числа (на С) #3
Спасибо большое. А вы уверены что тут всё правильно:
C
1
return !number ? 0 : !(number & 1) + count_even_digits(number / 10);
?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.04.2011, 15:36     Рекурсия: подсчет количества четных цифр числа (на С) #4
Do6oDyH, а вы нет? Чем вызвана неуверенность?
Do6oDyH
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 71
18.04.2011, 15:40  [ТС]     Рекурсия: подсчет количества четных цифр числа (на С) #5
C
1
number ? 0
Что это значит?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.04.2011, 15:48     Рекурсия: подсчет количества четных цифр числа (на С) #6
Объясняю посимвольно:
?: - тернарный оператор. Если написано exp1 ? exp2 : exp3, это означает, что если exp1 истинно, то результатом операции будет exp2, в ином же случае exp3.
В данном случае: !number - проверка, не нулевое ли число. Если так - то достигнута база рекурсии, результатом будет 0. Если нет, то надо к итоговой сумме (которая получается в результате рекурсивных вызовов count_even_digits) прибавить 0 или 1, в зависимости от того, является ли очередная просматриваемая цифра числа (в данном случае - последняя) чётной или нечётной. number & 1 - проверка на чётность (младший разряд нечётного числа 1, чётного 0). Поскольку младший разряд последней цифры числа совпадает с младшим разрядом всего числа, нет смысла вычленять последнюю цифру через остаток от деления на 10, можно сразу проверить всё число. Так вот, если число у нас чётное, то мы к итоговой сумме (которая, повторюсь, получается неявно в последовательных рекурсивных вызовах) должны прибавить 1, иначе 0 (результат, инверсный результат проверки на чётность), а затем рекурсивно вызвать нашу функцию, но для числа без последней цифры (которую мы только что проверили и включили в результат).
В итоге результат можно расписать в виде суммы нулей и единиц, общее количество слагаемых равно количеству цифр числа, и на каждой позиции, где в числе стоит нечётная цифра, в сумме будет стоять 0, а где чётная - 1. Т.е. примерно так
Код
1   2   4   3   5   6   2   7
0 + 1 + 1 + 0 + 0 + 1 + 1 + 0
Do6oDyH
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 71
18.04.2011, 15:49  [ТС]     Рекурсия: подсчет количества четных цифр числа (на С) #7
А можно как-то по другому?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.04.2011, 15:52     Рекурсия: подсчет количества четных цифр числа (на С) #8
Эхх... Хотелось как лучше... Примитивизм в действии)))

C
1
2
3
4
5
6
7
8
9
10
11
12
size_t count_even_digits(int number)
{
    int term = 0;
 
    if (number == 0)
        return 0;
 
    if (number % 2 == 0)
        term = 1;
 
    return term + count_even_digits(number / 10);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2011, 15:54     Рекурсия: подсчет количества четных цифр числа (на С)
Еще ссылки по теме:

C++ Подсчет количества "счастливых" билетов с заданной суммой цифр
C++ Подсчет в каждой строке количества и суммы элементов, состоящих из двух цифр, сумма которых не делится на 2
C++ Подсчет количества цифр в вещественном числе

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Do6oDyH
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 71
18.04.2011, 15:54  [ТС]     Рекурсия: подсчет количества четных цифр числа (на С) #9
Спасибо
Yandex
Объявления
18.04.2011, 15:54     Рекурсия: подсчет количества четных цифр числа (на С)
Ответ Создать тему
Опции темы

Текущее время: 21:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru