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

23.07 Количество результатов выполнения программ

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

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

Задача 1#30483

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

1. Вычесть 10

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

3. Модуль числа

Программа для исполнителя — это последовательность команд.

Сколько существует различных результатов выполнения программ, содержащих 10 команд и начинающих свою работу из 1. При этом исполнитель не может совершать ходы, которые не изменяют знак числа. Например, из числа 1 нельзя попасть в число 1, но можно в -9 и в -2.

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

Рекурсивное решение

Мы будем использовать рекурсию для перебора всех возможных траекторий команд:

1. Создаём пустое множество A, чтобы хранить уникальные результаты.

2. Определяем рекурсивную функцию f(st, count, end_count), где st — текущее число, count — количество применённых команд, end_count — общее количество команд.

3. Если count == end_count, добавляем текущее число st в множество A, так как достигли конца программы.

4. Если команд осталось, проверяем знак текущего числа:

- Если st > 0:

- Применяем команду умножить на -2: st * (-2), увеличиваем count на 1.

- Применяем команду вычесть 10, если результат отрицателен (st - 10 < 0), увеличиваем count на 1.

- Если st < 0:

- Применяем команду модуль числа: abs(st), увеличиваем count на 1.

- Применяем команду умножить на -2: st * (-2), увеличиваем count на 1.

5. После всех рекурсивных вызовов множество A содержит все уникальные результаты.

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

# Рекурсивная функция для перебора всех последовательностей команд
def f(st, count, end_count):
    if count == end_count:
        # Добавляем текущее число в множество уникальных результатов
        A.add(st)
    else:
        if st > 0:
            # Команда умножить на -2
            f(st * (-2), count + 1, end_count)
            # Команда вычесть 10, только если результат отрицателен
            if st - 10 < 0:
                f(st - 10, count + 1, end_count)
        if st < 0:
            # Команда модуль числа
            f(abs(st), count + 1, end_count)
            # Команда умножить на -2
            f(st * (-2), count + 1, end_count)

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

# Выводим количество различных результатов
print(len(A))

Решение через итеративное множество

1. Создаём множество ans с исходным числом 1.

2. Для каждой из 10 команд выполняем следующие шаги:

- Создаём новое множество can_get.

- Для каждого числа i в ans:

* если i > 0:

- добавляем i * (-2);

- если i - 10 < 0, добавляем i - 10;

* если i < 0:

- добавляем abs(i);

- добавляем i * (-2).

- После обработки всех чисел обновляем ans = can_get.

3. В конце размер множества ans даёт количество уникальных результатов.

# Множество для хранения текущих результатов
ans = set()
ans.add(1)

# Последовательно применяем 10 команд
for operations in range(10):
    can_get = set()
    for i in ans:
        if i > 0:
            can_get.add(i * (-2))
            if i - 10 < 0:
                can_get.add(i - 10)
        else:
            can_get.add(abs(i))
            can_get.add(i * (-2))
    ans = can_get

# Выводим количество различных результатов
print(len(ans))

Ответ: 28

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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