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

23.01 Количество программ из A в B

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

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

Задача 1#75074

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

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

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

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

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

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

Идея решения с помощью рекурсии заключается в том, что мы определяем функцию, которая подсчитывает количество способов преобразовать число a  в число b  . Внутри функции задаём три условия: если текущее число   a  превысило b  , то возвращаем 0  , так как дальнейшие преобразования не имеют смысла; если a  совпало с b  , то возвращаем 1  , так как найден корректный путь; если ни одно из этих условий не выполнено, то функция вызывает саму себя дважды — первый раз с аргументом a+ 2  (что соответствует команде "прибавить 2"), второй раз с аргументом a∗ 3  (что соответствует команде "умножить на 3"). Таким образом, итоговое количество способов будет равно сумме результатов этих двух рекурсивных вызовов. Запуск функции с начальными значениями f(7,77)  даст количество всех программ, которые из числа 7 приводят к числу 77.

# Определяем функцию f(a, b), которая считает количество программ
def f(a, b):
    # Если текущее число стало больше целевого,
    # то путь невозможен, возвращаем 0
    if a > b:
        return 0
    # Если текущее число совпало с целевым,
    # значит найден подходящий путь, возвращаем 1
    if a == b:
        return 1
    # В противном случае пробуем оба варианта:
    # прибавить 2 или умножить на 3, и складываем количество путей
    return f(a + 2, b) + f(a * 3, b)

# Запускаем функцию от 7 до 77 и выводим результат
print(f(7, 77))

Решение динамикой

Идея динамического подхода состоит в том, чтобы построить массив, где индекс соответствует числу, а значение по этому индексу показывает количество способов добраться до этого числа. Сначала заполняем массив нулями, а в ячейку с индексом 7 записываем 1, так как изначально мы находимся в числе 7, и существует ровно один способ быть в этом положении. Далее для каждого числа i  от 8 до 77 вычисляем количество способов добраться до него:

- если в i  можно попасть из i− 2  командой "прибавить 2 то добавляем a[i− 2]  ; - если i  делится на 3, то в него можно попасть из i∕∕3  командой "умножить на 3 и тогда добавляем a[i∕∕3]  ; - иначе такой переход невозможен.

Таким образом, при проходе по всем значениям последовательно мы получаем корректные значения для всех индексов массива, а итоговый ответ хранится в a[77]  .

# Создаем массив из 80 элементов, все значения изначально равны 0
a = [0] * 80
# В ячейку с индексом 7 записываем 1, так как стартуем с числа 7
a[7] = 1
# Перебираем все числа от 8 до 77
for i in range(8, 78):
    # В число i можно попасть двумя способами:
    # 1) из i-2 командой "прибавить 2"
    # 2) из i//3 командой "умножить на 3", только если i делится на 3
    a[i] = a[i - 2] + a[i // 3] * (i % 3 == 0)

# Выводим количество программ, которые ведут от 7 к 77
print(a[77])

Ответ: 14

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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