23.04 Количество программ из A в B где траектория вычислений НЕ содержит число(-а)
Ошибка.
Попробуйте повторить позже
Исполнитель преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Сделай нечётное
Выполняя первую команду, исполнитель увеличивает число на 1, а выполняя вторую – из числа x получает число 2x+1. Сколько существует программ, для которых при исходном числе 1 результатом является число 25 и при этом траектория вычислений не содержит число 21?
Решение рекурсией
Мы используем рекурсивный метод для подсчета всех программ, которые приводят от числа 1 к числу 25, избегая
числа 21. Для этого мы определяем функцию f(n, m), которая возвращает количество таких программ. Основная
логика функции строится на проверках текущего числа относительно целевого числа
и запрещённого числа
21:
1. Сначала проверяем, равно ли текущее число целевому
.
- Если , значит мы нашли корректный путь, поэтому возвращаем 1.
2. Затем проверяем, превысило ли текущее число целевое
или равно запрещённому числу 21.
- Если или
, путь невозможен, возвращаем 0.
3. Если ни одно из этих условий не выполнено, мы рассматриваем два возможных действия, которые может выполнить исполнитель:
- Выполнить команду "прибавить 1 что соответствует рекурсивному вызову f(n+1, m).
- Выполнить команду "сделай нечётное что соответствует рекурсивному вызову f(n*2 + 1, m).
Мы складываем результаты этих двух рекурсивных вызовов, чтобы получить общее количество программ для
текущего числа . Начальный вызов функции 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))
Специальные программы

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

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

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

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

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

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