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

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

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

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

Задача 1#60494

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

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

2. Умножить на 2

Программа для исполнителя Лето – это последовательность команд. Сколько различных результатов можно получить из исходного числа 3 в ходе исполнения программы, содержащей ровно 8 команд?

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

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

1. Прибавить 2 2. Умножить на 2

Программа для исполнителя Лето — это последовательность команд. Сколько различных результатов можно получить из исходного числа 3 в ходе исполнения программы, содержащей ровно 8 команд?

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

Идея решения заключается в том, что мы будем строить все возможные траектории исполнения программы с помощью рекурсивной функции. Мы создаём множество a, в котором будут храниться все уникальные результаты, полученные после применения ровно 8 команд. Функция f(n, c) принимает два параметра: n — текущее число на доске, и c — количество уже выполненных команд.

1. На каждом вызове функции проверяем условие завершения: - если c == 8, это значит, что выполнено ровно 8 команд, и текущий результат n добавляется в множество a, чтобы учесть его как один из возможных результатов; - если c < 8, мы продолжаем рекурсивно применять команды.

2. Для рекурсивного перехода применяем обе доступные команды: - вызываем f(n+2, c+1), что соответствует прибавлению 2 к текущему числу и увеличению счётчика команд на 1; - вызываем f(n*2, c+1), что соответствует умножению текущего числа на 2 и увеличению счётчика команд на 1.

3. После завершения всех рекурсивных вызовов множество a будет содержать все уникальные числа, которые можно получить из числа 3 с помощью ровно 8 команд. Количество различных результатов вычисляется с помощью функции len(a).

# Создаем пустое множество для хранения уникальных результатов
a = set()  # множество для ответа

# Определяем рекурсивную функцию f
# n - текущее число, c - количество выполненных команд
def f(n, c):
    # Если выполнено ровно 8 команд, добавляем текущее число в множество
    if c == 8:
        a.add(n)
    else:
        # Иначе продолжаем рекурсию, применяя команду "прибавить 2"
        f(n+2, c+1)
        # И применяя команду "умножить на 2"
        f(n*2, c+1)

# Запускаем рекурсивный перебор с начальным числом 3 и 0 выполненных команд
f(3, 0)
# Выводим количество уникальных результатов после 8 команд
print(len(a))

Ответ: 114

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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