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

16.02 Две функции

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

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

Задача 1#61890

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

F (n) = n2  , при n < 20

F (n) = G(n∕∕2)∗ 3− F(n − 2)  , если n > 19  и остаток от деления n  на 2 равен 0

F (n) = G(n − 2)  , если n > 19  и остаток от деления n  на 2 равен 1

G (n) = 3∗ n+ F(n − 2)  , если n < 20  и не делится на 5

G (n) = G(n − 2) + F(n∕∕5)  , если n < 20  и делится на 5

G (n) = n3  , в других случаях

Определите наибольшее значение n  из отрезка [1;480]  , при котором сумма цифр значения F(n)  равна 48.

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

Рекурсивное решение
В задаче определены две взаимно рекурсивные функции F(n)  и G (n)  . Для реализации создаём две пользовательские функции в Python с помощью def  . Объявляем функцию F(n)  с базовым случаем при n < 20  , и двумя рекурсивными случаями для n > 19  в зависимости от чётности. Аналогично объявляем функцию G(n)  с разными рекурсивными случаями в зависимости от делимости n  на 5. В конце перебираем n  от 480 до 1 (перебираем по убыванию, чтобы найти сразу наибольшее n), вычисляем сумму цифр F(n)  и выводим наибольшее n  , где сумма равна 48.

def f(n):  # объявляем функцию f(n)
    if n > 19 and n % 2 == 0:
        # рекурсивный случай для чётных n > 19
        return g(n // 2) * 3 - f(n - 2)
    if n > 19 and n % 2 == 1:
        # рекурсивный случай для нечётных n > 19
        return g(n - 2)
    # базовый случай для n < 20
    return n ** 2


def g(n):  # объявляем функцию g(n)
    if n < 20 and n % 5 != 0:
        # рекурсивный случай для n < 20 и некратных 5
        return 3 * n + f(n - 2)
    elif n < 20 and n % 5 == 0:
        # рекурсивный случай для n < 20 и кратных 5
        return g(n - 2) + f(n // 5)
    # все остальные случаи
    return n ** 3


# перебор n от 480 до 1 для поиска наибольшего n с нужной суммой цифр
for i in range(480, 0, -1):
    s, summa = abs(f(i)), 0

    # подсчёт суммы цифр числа
    while s > 0:
        summa += (s % 10)
        s //= 10

    # проверка условия
    if summa == 48:
        print(i)  # выводим ответ
        break  # завершаем перебор

Ответ: 478

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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