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

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

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

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

Задача 1#30459

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

F (n) = 1  при n ≤ 1

F (n) = F(n − 1) +F (n− 2)+ n  если n > 1  и n  кратно 3

F (n) = F(n − 2) +2  в остальных случаях

Сколько существует значений n на отрезке [1, 1500], для которых сумма цифр значения функции F(n) является простым числом?

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

Рекурсивное решение

В задаче задан рекурсивный алгоритм, при котором функция в процессе вычислений вызывает сама себя с другими аргументами. Для реализации создаём пользовательскую функцию в Python с помощью def  . Внутри функции используем условный оператор if  , чтобы задать ветвление: F (n) = 1  при n ≤ 1  ; если n > 1  и n%3 = 0  , то F (n) = F (n − 1)+ F(n − 2)+ n  ; иначе F(n) = F(n− 2)+ 2  . Перебираем все n ∈ [1,1500]  , для каждого вычисляем F (n)  , находим сумму его десятичных цифр S(n)  , проверяем, является ли S (n )  простым числом, и считаем количество таких n  . Для ускорения вычислений удобно кэшировать значения F (n )  .

from functools import lru_cache

# Кэширование результатов для оптимизации
@lru_cache(None)
def f(n):
    # База рекурсии
    if n <= 1:
        return 1
    # При n > 1 и n кратно 3
    elif n > 1 and n % 3 == 0:
        return f(n - 1) + f(n - 2) + n
    # Иначе
    else:
        return f(n - 2) + 2

# Функция для вычисления суммы цифр
def summa(n):
    dig_sum = 0
    while n > 0:
        dig_sum += (n % 10)
        n //= 10
    return dig_sum

# Проверка на простоту
def is_prime(n):
    if n < 2:
        return False
    # Перебираем до корня
    for j in range(2, int(n ** 0.5) + 1):
        # Если хоть один делитель есть, то число простое
        if n % j == 0:
            return False
    return True

ans = 0
for i in range(1, 1500 + 1):
    # Если сумма цифр простая
    if is_prime(summa(f(i))):
                                                                                                     
                                                                                                     
        # То обновляем счётчик
        ans += 1
print(ans)

Ответ: 301

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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