23.08 Прочие прототипы
Ошибка.
Попробуйте повторить позже
Исполнитель преобразует число на экране. У исполнителя есть три команды, которым присвоены номера:
1. Увеличь на 1
2. Увеличь на 3
3. Умножь на 4
Программа для исполнителя – это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 824, при этом траектория вычислений содержит числa 21 и 68, причём можно использовать только ту команду, чей номер отличается на 1 от номера команды, выполненной на предыдущем шаге?
Решение рекурсией
Мы решаем задачу с помощью рекурсии, определяя функцию, которая подсчитывает количество всех корректных
программ, преобразующих число в число
, с учетом ограничений по траектории и правилам смены команд. В
функции мы вводим следующие параметры:
1. — текущее число на экране;
2. — целевое число;
3. — номер команды, выполненной на предыдущем шаге (по умолчанию
, если это старт);
4. — флаг, указывающий, что число 21 уже встречено в траектории;
5. — флаг, указывающий, что число 68 уже встречено в траектории.
Логика работы функции:
1. Сначала проверяем, не превысило ли текущее число целевое
.
- Если , дальнейшие шаги не могут привести к результату, возвращаем 0.
2. Проверяем, совпадает ли текущее число с целевым, и встречены ли оба числа 21 и 68.
- Если и
и
равны True, значит найден корректный путь, возвращаем 1.
3. Обновляем флаги наличия чисел 21 и 68:
- Если , устанавливаем
.
- Если , устанавливаем
.
4. Далее определяем, какие команды можно выполнить на текущем шаге, учитывая правило смены команд:
- Если предыдущая команда была 1 или 3, разрешена только команда 2.
- Если предыдущая команда была 2, разрешены команды 1 и 3.
- Если это первый шаг (), разрешены все три команды.
5. Для каждой разрешенной команды вызываем рекурсивно функцию с новым значением числа , новым номером
последней команды
, и текущими флагами
,
.
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))
Специальные программы

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

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

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

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

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

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