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

23.06 Количество программ из A в B где траектория вычислений N команда

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

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

Задача 1#60493

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

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

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

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

Программа для исполнителя Май – это последовательность команд. Сколько различных результатов можно получить из исходного числа 7 в ходе исполнения программы, содержащей ровно 13 команд?

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

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

Мы решаем эту задачу с помощью рекурсии. Основная идея заключается в том, что мы определяем функцию f(n, c), которая будет рекурсивно перебором всех возможных команд считать множество всех чисел, которые можно получить из текущего числа n  , используя c  уже выполненных команд.

1. Создаем пустое множество a = set(), которое будет хранить все уникальные результаты. Множество автоматически исключает дубликаты, поэтому если одно и то же число получится разными способами, оно будет учтено только один раз.

2. Определяем функцию f(n, c):

- Проверка количества команд: если c == 13, значит мы выполнили ровно 13 команд. В этом случае:

      - Добавляем текущее число n в множество a, используя a.add(n).

- Иначе: если команд меньше 13, продолжаем рекурсивный перебор всех вариантов команд:

      - Вызываем f(n+1, c+1), что соответствует выполнению команды «прибавить 1».

      - Вызываем f(n*3, c+1), что соответствует выполнению команды «умножить на 3».

      - Вызываем f(n*2, c+1), что соответствует выполнению команды «умножить на 2».

3. Запускаем функцию с начальными значениями f(7, 0), где 7 — исходное число, а 0 — количество выполненных команд.

4. После завершения рекурсивных вызовов множество a будет содержать все уникальные числа, которые можно получить после 13 команд. Чтобы узнать количество различных результатов, выводим длину множества через print(len(a)).

# Создаем пустое множество для хранения уникальных результатов
a = set()

# Определяем рекурсивную функцию f(n, c)
# n — текущее число на доске
# c — количество выполненных команд
def f(n, c):
    # Если выполнено ровно 13 команд,
    # добавляем текущее число в множество результатов
    if c == 13:
        a.add(n)
    else:
        # Иначе продолжаем выполнение рекурсивно для всех трех команд
        # 1) Прибавляем 1 и увеличиваем счетчик команд на 1
        f(n+1, c+1)
        # 2) Умножаем на 3 и увеличиваем счетчик команд на 1
        f(n*3, c+1)
        # 3) Умножаем на 2 и увеличиваем счетчик команд на 1
        f(n*2, c+1)

# Запускаем рекурсивный перебор, начиная с числа 7 и 0 выполненных команд
f(7, 0)

# Выводим количество уникальных результатов после 13 команд
print(len(a))

Ответ: 43290

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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