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

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

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

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

Задача 1#84012

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

1. Прибавь 3

2. Прибавь 7

3. Прибавь 1

4. Умножь на 2

5. Умножь на 4

6. Умножь на 1.5

Причём команду 6 можно использовать только если число на экране чётное. Программа для исполнителя – это последовательность команд.

Сколько различных результатов можно получить при исходном числе 10 в ходе исполнения программы, содержащей не менее 1, но не более 8 команд, если известно, что совершать можно только команду, чей номер отличен по чётности от номера команды, совершенной на предыдущем шаге (например после команды 2 нельзя использовать команду 4, но можно команду 5)?

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

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

1. Используем рекурсивную функцию f(a,c,k)  , где

- a  — текущее число,

- c  — номер предыдущей команды,

- k  — количество выполненных команд.

2. Если 1 ≤ k ≤ 8  , добавляем текущее число a  в множество s  .

3. Если k > 8  , прекращаем рекурсию.

4. Если предыдущая команда c  нечётная, можно применять только чётные команды (2,4,6). Команду 6 применяем только если a  чётное.

5. Если предыдущая команда c  чётная, можно применять только нечётные команды (1,3,5).

6. Начальное значение c = 0.5  , чтобы допустить обе ветви на первом шаге.

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

# Рекурсивная функция
def f(a, c = 0.5, k = 0):
    if 1 <= k <= 8:
        s.add(a)
    elif k > 8:
        return 0

    if c % 2 != 0:  # Предыдущая команда нечётная, используем чётные
        f(a + 7, 2, k + 1)
        f(a * 2, 4, k + 1)
        if a % 2 == 0:  # Команду 6 можно применять только для чётных
            f(int(a * 1.5), 6, k + 1)

    if c % 2 != 1:  # Предыдущая команда чётная, используем нечётные
        f(a + 3, 1, k + 1)
        f(a + 1, 3, k + 1)
        f(a * 4, 5, k + 1)

# Запуск рекурсии от исходного числа 10
f(10)

# Количество различных результатов
print(len(s))

Ответ: 2232

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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