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

16.01 Одна функция

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

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

Задача 1#56376

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

F (n) = n!  , если n ≥ 5000,

F (n) = 2⋅F (n + 1)∕(n + 1)  , если 1 ≤ n < 5000  .

Чему равно значение выражения 1000⋅F (7)∕F(4)  ?

Примечание. Факториал числа n  , который обозначается как n!  , вычисляется по формуле n! = 1⋅2 ⋅ ... ⋅n  .

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

Динамическое решение

Решим динамически: создадим массив и заполним его значениями n!  для каждого fact(n)  , чтобы не было лишних вычислений при повторных вызовах. Далее создадим массив уже для хранения значений функции от условия — каждому i-тому элементу соответствует f (i)  , заполним его по функции из условия в обрятном порядке (ибо при вызове рекурсивной формулы от числа [a]  нужны данные по элементу [a + 1]  ). Вычислем ответ и выведем его через print  .

# Создадим массив, где последовательно просчитаем
# факториал от i-того элемента, берем 7000 с запасом
fact = [1] * 7001
for n in range(1, 7001):
    # Так как идем с единицы, а по условию
    # n! = ... * (n - 1) * n, то при последовательном вычислении
    # на каждом шаге будем домножать факториал предыдущего числа на
    # новое число, и получится факториал нового числа
    fact[n] = fact[n - 1] * n

# Создадим массив для хранения f[i]
f = [0] * 7001
# Так как рекурсивная формула обращается к значениям числа больше его
# самого, то заполняем массив по убыванию
for i in range(7000, 1, -1):
    # База рекурсии для i >= 5000
    if i >= 5000:
        f[i] = fact[i]
    else:
    # Рекуррентная формула для остальных числе
        f[i] = 2 * f[i + 1] // (i + 1)

# Вычисляем ответ
print(1000 * f[7] / f[4])

Решение аналитически:

Поскольку числа слишком большие, то будем решать аналитикой. Для начала вычислим значения F (4999),F(4998),F(4997) :

            F (5000)
F (4999) = 2 ∗-5000- = 2∗ 4999!

F (4998) = 2 ∗ F-(4999) = 22 ∗ 4998!
              4999

            F (4998)
F (4997) = 2 ∗------ = 23 ∗ 4997!
              4998

Замечаем, что в общем виде F  вычисляется как         5000−n
F (n) = 2     ∗n!

Вычислим требуемое и получим ответ.

Ответ: 26250

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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