Тема 16. Рекурсивные алгоритмы

16.02 Две функции

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

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

Задача 1#136692

Алгоритм вычисления функций F(n) и G(n), где n – целое число, задан следующими соотношениями:

F (n) = 2∗ (G (n − 3)+ 8);

G (n) = 2∗ n, если n < 10;

G (n) = G(n − 2) + 1, если n ≥ 10.

Чему равно значение выражения F(15 548)?

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

Идея рекурсивного решения:

Для вычисления F (15548)  нужно уметь находить G(n)  . Функция G(n)  задана рекурсивно:

      (
      { 2n,          n < 10,
G(n) = ( G(n − 2)+ 1, n ≥ 10.

Её реализуем как рекурсивную функцию g(n). Чтобы не пересчитывать одни и те же значения, используем мемоизацию (lru_cache). Функция F(n)  вычисляется через G (n − 3)  , поэтому достаточно вызвать f(15548).

Решение через рекурсию:

from functools import lru_cache

# Рекурсивная функция g с мемоизацией
@lru_cache(None)
def g(n):
    if n < 10:
        return 2 * n
    return g(n - 2) + 1

# Функция f через g
@lru_cache(None)
def f(n):
    return 2 * (g(n - 3) + 8)

# Выгружаем сначала в память значения функции от 1 до 15548
for i in range(15549):
    f(i)

# Вычисление результата
print(f(15548))

Идея динамического решения:

Заведём массив g и последовательно вычислим его значения: для n < 10  положим g[n] = 2n  , а для n ≥ 10  используем формулу g[n] = g[n − 2]+ 1  . После этого в массив f заполним значения по формуле F (n ) = 2⋅(g[n − 3]+ 8)  . Такой способ удобен, так как каждое значение считается один раз и легко получить F (15548)  .

Решение через динамику:

g = [0] * 16000
f = [0] * 16000

# Заполнение значений g
for n in range(16000):
    if n < 10:
        g[n] = 2 * n
    else:
        g[n] = g[n - 2] + 1

# Вычисление значений f
for n in range(16000):
    f[n] = 2 * (g[n - 3] + 8)

print(f[15548])

Ответ: 15588

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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