23.01 Количество программ из A в B
Ошибка.
Попробуйте повторить позже
Исполнитель Snowman преобразует число на экране. У исполнителя есть четыре команды:
1. Прибавить 1
2. Прибавить 3
3. Умножить на 2
4. Умножить на 3
Программа для исполнителя - это последовательность команд. Сколько существует значений, в которые можно прийти за 12 команд из числа 6 и при этом не содержат двух последовательных команд сложения и двух последовательных команд умножения?
Решение рекурсией
Мы определяем рекурсивную функцию f(a, c, com), которая строит все допустимые последовательности команд и добавляет полученные результаты в множество d.
1. Аргументы функции:
- a — текущее число на экране.
- c — количество выполненных команд.
- com — тип предыдущей команды:
- "1"— предыдущая команда была сложением (1 или 2).
- "2"— предыдущая команда была умножением (3 или 4).
- ” — начальное состояние, когда команды еще не выполнялись.
2. В функции выполняем следующие действия:
- Проверяем, не превысили ли количество команд 12:
- Если c > 12, прекращаем выполнение функции.
- Проверяем, достигли ли точно 12 команд:
- Если c == 12, добавляем текущее число a во внешнее множество d и выходим из функции.
- Если c < 12, продолжаем выполнять команды. При этом проверяем ограничение на последовательные одинаковые типы команд:
- Если предыдущая команда была сложением (com == "1"), можно выполнять только команды умножения (*2, *3), чтобы не было двух последовательных сложений.
- Если предыдущая команда была умножением (com == "2"), можно выполнять только команды сложения (+1, +3), чтобы не было двух последовательных умножений.
- Если предыдущей команды не было (com == ), можно выполнить любую команду.
3. Создаем пустое множество d для хранения уникальных значений и запускаем рекурсию с начального числа 6, 0 команд и пустой предыдущей командой.
4. После завершения рекурсии выводим размер множества d, который соответствует количеству различных значений.
# Создаем множество для хранения уникальных результатов d = set() # Рекурсивная функция для перебора всех программ def f(a, c, com): # Если число команд больше 12, прекращаем выполнение if c > 12: return 0 # Если достигнуто ровно 12 команд, добавляем число в множество if c == 12: d.add(a) return # Если команд меньше 12, продолжаем выполнение if c < 12: # Если предыдущая команда была сложением, выполняем только умножение if com == "1": f(a * 2, c+1, "2") f(a * 3, c+1, "2") # Если предыдущая команда была умножением, выполняем только сложение elif com == "2": f(a + 1, c+1, "1") f(a + 3, c+1, "1") # Если предыдущей команды не было, выполняем все команды else: f(a + 1, c+1, "1") f(a + 3, c+1, "1") f(a * 2, c+1, "2") f(a * 3, c+1, "2") # Запускаем рекурсию с начального числа 6, 0 команд, без предыдущей команды f(6, 0, "") # Выводим количество уникальных значений, достигнутых за 12 команд print(len(d))
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

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

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

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

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

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!