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

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

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

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

Задача 1#84021

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

1. Увеличь на 1

2. Увеличь на 3

3. Умножь на 4

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

Сколько существует программ, для которых при исходном числе 1 результатом является число 824, при этом траектория вычислений содержит числa 21 и 68, причём можно использовать только ту команду, чей номер отличается на 1 от номера команды, выполненной на предыдущем шаге?

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

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

Мы решаем задачу с помощью рекурсии, определяя функцию, которая подсчитывает количество всех корректных программ, преобразующих число a  в число b  , с учетом ограничений по траектории и правилам смены команд. В функции мы вводим следующие параметры:

1. a  — текущее число на экране;

2. b  — целевое число;

3. c  — номер команды, выполненной на предыдущем шаге (по умолчанию 0  , если это старт);

4. r1  — флаг, указывающий, что число 21 уже встречено в траектории;

5. r2  — флаг, указывающий, что число 68 уже встречено в траектории.

Логика работы функции:

1. Сначала проверяем, не превысило ли текущее число a  целевое b  .

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

2. Проверяем, совпадает ли текущее число с целевым, и встречены ли оба числа 21 и 68.

- Если a == b  и r1  и r2  равны True, значит найден корректный путь, возвращаем 1.

3. Обновляем флаги наличия чисел 21 и 68:

- Если a == 21  , устанавливаем r1 = True  .

- Если a == 68  , устанавливаем r2 = True  .

4. Далее определяем, какие команды можно выполнить на текущем шаге, учитывая правило смены команд:

- Если предыдущая команда была 1 или 3, разрешена только команда 2.

- Если предыдущая команда была 2, разрешены команды 1 и 3.

- Если это первый шаг (c = 0  ), разрешены все три команды.

5. Для каждой разрешенной команды вызываем рекурсивно функцию с новым значением числа a  , новым номером последней команды c  , и текущими флагами r1  , r2  .

6. Суммируем результаты всех рекурсивных вызовов и возвращаем их как общее количество программ.

Таким образом, при запуске функции f(1, 824) она рекурсивно переберет все возможные последовательности команд, учитывая ограничения на смену команд и наличие чисел 21 и 68 в траектории, и вернет общее количество корректных программ.

# Определяем рекурсивную функцию f(a, b, c=0, r1=False, r2=False)
# a — текущее число, b — целевое число
# c — номер предыдущей команды, r1 и r2 — флаги наличия чисел 21 и 68
def f(a, b, c = 0, r1 = False, r2 = False):
    # Если текущее число превысило целевое,
    # путь невозможен, возвращаем 0
    if a > b:
        return 0
    # Если достигли целевого числа и оба числа 21 и 68 уже встречены,
    # то путь корректен, возвращаем 1
    if a == b and r1 and r2:
        return 1
    # Обновляем флаги наличия чисел 21 и 68
    if a == 21:
        r1 = True
    if a == 68:
        r2 = True

    # Проверяем предыдущую команду и разрешенные следующие шаги
    if c == 1 or c == 3:
        # Если предыдущая команда 1 или 3, разрешена только команда 2
        return f(a + 3, b, 2, r1, r2)
    if c == 2:
        # Если предыдущая команда 2, разрешены команды 1 и 3
        return f(a + 1, b, 1, r1, r2) + f(a * 4, b, 3, r1, r2)

    # Если предыдущей команды не было, разрешены все три команды
    return f(a + 1, b, 1, r1, r2) + f(a + 3, b, 2, r1, r2) + f(a * 4, b, 3, r1, r2)

# Запускаем рекурсивную функцию от 1 до 824 и выводим количество корректных программ
print(f(1, 824))

Ответ: 36

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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