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

23.01 Количество программ из A в B

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

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

Задача 1#75064

Исполнитель 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))

Ответ: 124

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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