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

23.04 Количество программ из A в B где траектория вычислений НЕ содержит число(-а)

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

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

Задача 1#63842

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

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

2. Сделай нечётное

Выполняя первую команду, исполнитель увеличивает число на 1, а выполняя вторую – из числа x получает число 2x+1. Сколько существует программ, для которых при исходном числе 1 результатом является число 25 и при этом траектория вычислений не содержит число 21?

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

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

Мы используем рекурсивный метод для подсчета всех программ, которые приводят от числа 1 к числу 25, избегая числа 21. Для этого мы определяем функцию f(n, m), которая возвращает количество таких программ. Основная логика функции строится на проверках текущего числа n  относительно целевого числа m  и запрещённого числа 21:

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

- Если n == m  , значит мы нашли корректный путь, поэтому возвращаем 1.

2. Затем проверяем, превысило ли текущее число n  целевое m  или равно запрещённому числу 21.

- Если n > m  или n ==  21  , путь невозможен, возвращаем 0.

3. Если ни одно из этих условий не выполнено, мы рассматриваем два возможных действия, которые может выполнить исполнитель:

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

- Выполнить команду "сделай нечётное что соответствует рекурсивному вызову f(n*2 + 1, m).

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

# Определяем рекурсивную функцию f(n, m) для подсчета количества программ
def f(n, m):
    # Если текущее число совпало с целевым, возвращаем 1
    if n == m:
        return 1
    # Если текущее число больше целевого или равно запрещенному числу 21, возвращаем 0
    if n > m or n == 21:
        return 0
    # В остальных случаях считаем количество программ,
    # выполняя каждую из двух возможных команд и суммируя результаты
    return f(n+1, m) + f(n*2 + 1, m)

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

Ответ: 20

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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