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

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

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

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

Задача 1#12828

Исполнитель преобразует число на экране.

У исполнителя есть две команды, которым присвоены номера:

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

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

Первая команда увеличивает число на экране на 1, вторая увеличивает число в 2 раза.

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

Сколько существует программ, которые преобразуют исходное число 1 в число 16?

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

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

Мы создаём список a, где индекс соответствует числу, а значение a[i] показывает количество способов попасть в это число, начиная с 1  .

1. В начале a[1] = 1, так как в исходном числе 1  можно находиться единственным способом — стартовав в нём.

2. Для каждого числа от 2  до 16  определяем количество способов:

- в число i  всегда можно попасть из i− 1  , если применить команду «+1»;

- если i  чётное, то в него можно попасть ещё и из i∕2  , если применить команду «умножить на 2».

3. Таким образом, формула:

             (
             { a[i∕∕2], если i чётное
a[i] = a[i− 1]+ ( 0,    если i нечётное

4. После заполнения массива значение a[16] покажет количество всех программ, преобразующих 1  в 16  .

# Создаем массив для хранения количества способов
a = [0] * (16 + 1)  # Ячейки от 0 до 16 включительно
# Начальная точка: в числе 1 можно быть только одним способом
a[1] = 1
# Заполняем массив для всех чисел от 2 до 16
for i in range(2, 16 + 1):
    # В число i можно попасть из (i-1), используя команду +1
    a[i] = a[i - 1]
    # Если число i четное, в него можно попасть из i//2, используя команду *2
    if i % 2 == 0:
        a[i] += a[i // 2]
# Выводим количество программ для числа 16
print(a[16])

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

Теперь определим функцию f(a), которая считает количество способов преобразовать число a в число 16  .

1. Если текущее число стало больше 16  , возвращаем 0, так как такие пути не подходят.

2. Если текущее число совпало с 16  , возвращаем 1, так как найден один правильный путь.

3. В остальных случаях запускаем два рекурсивных вызова:

- f(a+1) — это переход по команде «+1»;

- f(a*2) — это переход по команде «*2».

4. Суммируя эти значения, получаем общее количество программ, ведущих от числа a к числу 16  .

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

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

Решение руками

В четные числа мы можем попасть из числа деленного на 2 или предыдущего, а в нечетные только из предыдущих.
Получается, что в число 2 мы можем попасть из 1 двумя разными способами.
В число 3 мы можем попасть только из 2.
В число 4 мы можем попасть из 2 или 3.
В число 5 мы можем попасть только из 4.
И т.д.

PIC

Ответ: 36

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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