№16
Новый прототип 2026
Рекурсия и функции
Новый прототип 2026
№ 28761 Досрочная волна 2026 (Уровень: Средний)
Алгоритм вычисления значения функции \(F(n)\), где \(n\) – целое число, задан следующими соотношениями:
\(F(n)=3\) при \(n<10\);
\(F(n)=(n+4)×F(n−5)\), если \(n≥10\).
Чему равно значение выражения \((F(257487) / 683 + 67 \times F(257477)) / F(257472)\)?
В ответе запишите целую часть полученного числа
Здесь необходимо использовать модифицированный код:
Необходимо использовать lru_cache c параметром.
lru_cache — это декоратор в Python, который запоминает результаты функции.
Если вызвать функцию с теми же аргументами — она не считается заново, а берётся из кэша.
📌 Как работает
Хранит ограниченное число результатов и удаляет самые «старые» (которые давно не использовались).
📌 Параметры
maxsize — сколько значений хранить (по умолчанию = 128)
maxsize=None — без ограничений
🤔 А чем тогда функция lru_cache отличается от cache?
cache — это отдельно объявленный декоратор, но реализован он как обёртка над lru_cache и внутри она вызывает lru_cache(maxsize=None)
Решение:
from functools import lru_cache
@lru_cache(16)
# в вычисляемом выражении максимальная разница аргументов: 257_487 - 257_472 = 15
# поэтому храним только 257_487- 257_472 + 1 = 16 последних значений.
# можно взять просто 100, по затрачиваемым ресурсам разница невелика
def f(n):
if n < 10:
return 3
return (n + 4) * f(n - 5)
for i in range(1, 257488): # закэшируем только максимально необходимый диапазон
f(i)
print((f(257487) // 683 + f(257477) // 67) // f(257472))
# 24994252796625