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

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

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

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

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

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

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