Тема 23. Оператор присваивания и ветвления

23.08 Прочие прототипы

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела оператор присваивания и ветвления
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#30487

Исполнитель Щелчок преобразует число на экране. У исполнителя есть три команды:

1. Прибавить 1

2. Умножить на 3

3. Прибавить сумму цифр числа

Программа для исполнителя — это последовательность команд.

Сколько существует программ, для которых при исходном числe 11 результатом является число 60?

Показать ответ и решение

Решение рекурсией

Мы используем рекурсивный метод для подсчета всех возможных последовательностей команд, которые из числа     11  приведут к числу 60  . Идея заключается в том, что мы создаем функцию f(a, b), которая возвращает количество программ, преобразующих число a  в число b  . Для этого:

1. Сначала определяем вспомогательную функцию sum_of_digits(number), которая считает сумму цифр числа.

- Если число равно 0, возвращаем 0.

- Иначе берем последнюю цифру числа через оператор % 10 и прибавляем результат рекурсивного вызова для числа без последней цифры (целочисленное деление на 10).

- Мы используем @lru_cache(None), чтобы кешировать результаты вызовов функции и ускорить вычисления при повторных обращениях к одной и той же сумме цифр.

2. В функции f(a, b) проверяем следующие условия:

- Если текущее число a  равно целевому b  , то это означает, что мы достигли конца корректной программы, и возвращаем 1.

- Если текущее число a  превышает b  , то дальнейшие действия не могут привести к b  , поэтому возвращаем 0.

- В остальных случаях мы применяем все три команды:

      - прибавляем 1 к a  и вызываем функцию рекурсивно,

      - умножаем a  на 3 и вызываем функцию рекурсивно,

      - прибавляем сумму цифр числа a  (через функцию sum_of_digits(a)) и вызываем функцию рекурсивно.

- Суммируем результаты всех трех вызовов и возвращаем их, так как каждое из значений обозначает количество программ, приведших к цели из текущего состояния.

3. Запускаем функцию f(11, 60), чтобы получить количество всех программ, которые начинают с числа 11 и приводят к числу 60.

# Импортируем декоратор для кэширования функций
from functools import lru_cache

# Определяем функцию для подсчета суммы цифр числа с кэшированием
@lru_cache(None)
def sum_of_digits(number):
    # Если число равно 0, сумма цифр равна 0
    if number == 0:
        return 0
    else:
        # Суммируем последнюю цифру и рекурсивно вызываем для числа без последней цифры
        return number % 10 + sum_of_digits(number // 10)

# Определяем рекурсивную функцию f(a, b) для подсчета количества программ
def f(a, b):
    # Если текущее число равно целевому, найден путь
    if a == b:
        return 1
    # Если текущее число больше целевого, путь невозможен
    elif a > b:
        return 0
    else:
        # Считаем количество программ, применяя все три команды
        return f(a + 1, b) + f(a * 3, b) + f(a + sum_of_digits(a), b)

# Вызываем функцию для подсчета всех программ от 11 до 60
print(f(11, 60))

Ответ: 66173

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!