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

16.02 Две функции

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

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

Задача 1#30453

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

F (n) = n  , при n < 12

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

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

G (n) = F(n − 1) +n  , если n < 12  и не делится на 3

G (n) = G(n − 1) + F(n∕3)− n  , если n < 12  и делится на 3

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

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

Примечание: знак </> в данной задаче означает целочисленное деление.

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

Рекурсивное решение
В задаче определены две взаимно рекурсивные функции F(n)  и G (n)  . Для реализации создаём две пользовательские функции в Python с помощью def  . В F(n)  базовый случай при n < 12  , где возвращаем n  , для n > 11  будут два варианта: для чётных вычисляем G (n∕∕2)∗ 2− F (n − 1)  , для нечётных − G(n − 1)  . В функции G(n)  при n < 12  будет 3 варианта: если n  не делится на 3, используем F(n− 1)+ n  , если делится – G (n− 1)+ F (n ∕∕3) − n  , в остальных случаях возвращаем n∗ n  . Затем перебираем n  от 1000 до 1 (чтобы рассматривать сначала наибольшее n), считаем сумму цифр F (n)  и выводим наибольшее n  , у которого сумма цифр равна 33, завершаем перебор.

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


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


for i in range(1000, 0, -1):  # перебор от 1000 до 1

    # вычисляем модуль f(i) (чтобы отбросить знак) и обнуляем сумму
    s, summa = abs(f(i)), 0

    while s > 0:  # подсчёт суммы цифр
        summa += (s % 10)  # забираем последнюю цифру в сумму
        s //= 10  # "обрезаем" последнюю цифру
    if summa == 33:  # проверка условия
        print(i)  # выводим наибольшее n
        break  # завершаем цикл

Ответ: 946

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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