Задание №16 ЕГЭ по информатике: разбор, шаблоны кода Python и анти-примеры | СмартКИМ
СмартКИМ УДОБНАЯ ПОДГОТОВКА К ЕГЭ И ОГЭ
Задачи №16 Решать в тренажере Войти в СмартКИМ
ЕГЭ (1–27) ОГЭ (1–15) Python: шпаргалка
Быстрый переход по номерам и темам
Базовый (1 балл) Время: 2-3 мин Python def @lru_cache(None) sys.setrecursionlimit Все задачи №{ topic_num } в каталоге

Задание №16. Вычисление значений рекурсивных функций

Тема: Рекуррентные соотношения, снятие лимита стека и мемоизация @lru_cache
Вычисление значения функции F(N) по рекуррентным формулам. Требует мемоизации `@lru_cache(None)` и увеличения лимита рекурсии `sys.setrecursionlimit(50000)`.

1. Шаблон для Задания №16:

import sys
from functools import lru_cache

sys.setrecursionlimit(50000)

@lru_cache(None)
def F(n):
    if n == 1: return 1
    if n % 2 == 0: return n + F(n - 1)
    return 2 * F(n - 2)

Разновидности и прототипы задания на экзамене

Тип 1: Прямое вычисление F(2026)
Функция с lru_cache.
Тип 2: Вычисление разности или отношения F(2026) / F(2023)
Сокращение множителей.

Боевой шаблон решения на Python

Запустить код в онлайн-песочнице
# === Боевой шаблон Задания №16 на Python ===
import sys
from functools import lru_cache

# 1. Снимаем лимит глубины стека:
sys.setrecursionlimit(50000)

# 2. Обязательно кэшируем результаты:
@lru_cache(None)
def F(n):
    if n <= 1:
        return 1
    if n % 2 == 0:
        return 2 * n + F(n - 1)
    else:
        return 3 * n + F(n - 2)

# Прогреваем кэш снизу вверх для больших N:
for i in range(1, 2027):
    F(i)

print("Ответ F(2026):", F(2026))

Анти-примеры (Типичные ошибки vs Как делать правильно)

Как делать НЕ надо:
Ошибка: Забыть @lru_cache(None) при вычислении F(n-1) + F(n-2)
Программа зависнет на 10 минут из-за экспоненциального количества вызовов!
Как делать ПРАВИЛЬНО:
Правильно: ВСЕГДА вешать @lru_cache(None) на рекурсивную функцию.
ГРОБ

ГРОБ №16: Числа огромного порядка (F(2026) / F(2023))

Значение F(2026) содержит тысячи знаков и не влезает в память.

Как обойти ловушку: Распишите формулу на бумаге: в дроби $F(2026) / F(2023)$ почти все множители взаимно сокращаются!

Лайфхаки и подводные камни на экзамене:

  • Если число n очень большое (например, 5000+), вызовите функцию в цикле `for i in range(1, n+1): F(i)` для заполнения кэша без падения стека.
Банк реальных задач №16 Открыть в тренажере СмартКИМ