@demchenkodenis

Посчитать нечетные цифры числа методом рекурсии?

Добрый день!
Помогите разобраться с рекурсией, застрял на вопросе Посчитать четные и нечетные цифры введенного натурального числа. Ниже мой код
def count_numb(n):
    even = odd = 0
    if n == 0:
        return print("четных - %d, нечетных - %d" % (even, odd))
    elif n % 2 == 0:
        even += 1
        n == n // 10
        return count_numb(n)
    else:
        odd += 1
        n == n // 10
        return count_numb(n)
    
n = int(input("Введите число: "))
count_numb(n)
  • Вопрос задан
  • 2307 просмотров
Решения вопроса 2
@mikeyuriev
def count_even_odd(n):
    # на случай, если изначально n - отрицательное число
    n = abs(n)
    # если n чётное - последняя цифра тоже чётная
    result = (1, 0) if n % 2 == 0 else (0, 1)
    # если n сотоит из одной цифры - прерываем рекурсию
    if n < 10:
        return result
    # иначе - отрезаем от n последнюю цифру, 
    # вызываем функцию рекурсивно и суммируем результат
    return tuple(map(sum, zip(count_even_odd(n // 10), result)))
Ответ написан
Комментировать
@demchenkodenis Автор вопроса
Ребята, спасибо кто помогал! Ниже вывел код на котором остановился
def count_numb2(n, even=0, odd=0):
    if n == 0:
        print(f"Количество четных и нечетных цифр в числе равно: ({even}, {odd})")
    else:
        cur_n = n % 10
        n = n // 10
        if cur_n % 2 == 0:
            even += 1
        else:
            odd += 1
        return count_numb2(n, even, odd)

n = int(input("Введите число: "))
count_numb2(n)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
#even и odd - счётчики чётных/нечётных цифр, при первом вызове должны быть 0
def recursive_counter(number, even = 0, odd = 0):
  #проверяем, не пора ли остановить рекурсию:
  if number <= 0: #дошли до нуля - пора. Кроме того, с отриц. числами будут проблемы.
    return even, odd #возвращаем кортеж значений
  #отрезаем от числа последнюю цифру делением на 10.
  #divmod() - встроенная функция питона
  reduced_number, last_digit = divmod(number, 10)
  if last_digit % 2 == 0: #последняя цифра чётная
    #значит, на одну больше чётную цифру
    return recursive_counter(reduced_number, even+1, odd) #уходим в рекурсию
  else: #последняя цифра нечётная
    #значит, на одну больше нечётную цифру
    return recursive_counter(reduced_number, even, odd+1) #уходим в рекурсию

N = 1234567890
even, odd =  recursive_counter(N) #распаковываем кортеж, который вернула функция
print(f'В числе {N} есть {even} чётных цифр и {odd} нечётных.')
Ответ написан
Комментировать
@twistfire92
Python backend developer
Это что такое?
n == n // 10

Может так надо?
n = n // 10

И у вас все равно будут выводиться нули. Объявляйте переменные even odd вне функции и передавайте их в эту функцию в качестве параметра.

Если у вас python 3.6 и выше, то там завезли f-строки. Они поудобнее, ваш вывод был бы более читабелен
print(f"четных - {even}, нечетных - {odd}") (return в этой строке не нужен, как и в остальных случаях)

А рекурсивно - это требование задачи? Или вы посчитали, что так будет лучше?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы