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

23.06 Количество программ из A в B где траектория вычислений N команда

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

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

Задача 1#64030

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

1. Прибавь 4

2. Прибавь 7

3. Раздели нацело на 2

Первая команда увеличивает число на экране на 4, вторая увеличивает его на 7, третья делит на 2 нацело (остаток отбрасывается). Программа для исполнителя – это последовательность команд. Сколько существует программ, которые состоят из 10 команд и при исходном числе 1 результатом является 1?

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

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

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

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

2. b  — число, к которому нужно прийти после выполнения всех команд;

3. c  — количество уже выполненных команд.

Алгоритм работы функции следующий:

1. Проверяем, достигли ли мы необходимого количества команд:

- Если c == 10  , то программа завершена.

* В этом случае функция возвращает True (или 1), если текущее число a  равно b  , и False (или 0) в противном случае.

2. Если c < 10  , то продолжаем рекурсию:

- Пробуем первую команду: прибавляем 4 к числу a  , увеличиваем счётчик команд на 1, и вызываем функцию рекурсивно.

- Пробуем вторую команду: прибавляем 7 к числу a  , увеличиваем счётчик команд на 1, и вызываем функцию рекурсивно.

- Пробуем третью команду: делим число a  на 2 нацело (используя целочисленное деление), увеличиваем счётчик команд на 1, и вызываем функцию рекурсивно.

3. Складываем результаты всех трёх вызовов, чтобы получить общее количество программ, которые приводят к числу b  после 10 шагов.

Таким образом, вызов функции f(1, 1, 0) запускает подсчёт всех возможных последовательностей из 10 команд, начинающихся с числа 1 и заканчивающихся числом 1.

# Определяем рекурсивную функцию f(a, b, c)
def f(a, b, c):
    # Проверяем, достигли ли мы 10 команд
    if c == 10:
        # Если да, возвращаем True (1), если текущее число равно целевому, иначе False (0)
        return a == b
    # Если количество команд меньше 10, продолжаем рекурсию
    if c < 10:
        # Считаем все варианты: прибавить 4, прибавить 7, разделить на 2
        return f(a+4, b, c+1) + f(a+7, b, c+1) + f(a//2, b, c+1)

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

Ответ: 917

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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