код ничего не выводит, уже пробовал и менять значения, но мне кажется что то не так с lru_cache но не могу понять что
import sys
from functools import *
sys.setrecursionlimit(3000)
@lru_cache(maxsize=100)
def f(n):
if n>=2025:
return n
if n<2025:
return f(n+1) - f(n+2)+7
print(f(15)-f(24))
Ответы (1 шт):
С lru_cache всё нормально, проблема в том, как у вас вычисляется очередной элемент. Эта проблема называется n+1, если я ничего не путаю. Для того, чтобы вычислить f(n) вам нужны значения f(n+1) и f(n+2). Сначала вычисляется f(n+1), для вычисления которого нужны значения f(n+2) и f(n+3) и т.д. Т.е. кэш вообще не имеет возможности сработать - вам всё время нужны элементы, которых в нём ещё нет, функция продолжает вызывать сама себя (да ещё и по два раза за один её вызов) до тех пор, пока не исчерпается допустимый уровень рекурсии.
Но есть одна хитрость, которая может заставить ваш код работать. Если вы предварительно вызовете вашу функцию в обратном порядке по убывающей, то кэш будет при этом эффективно задействован для вычисления очередных элементов, да и нужные вам элементы там тоже запомнятся. Такой код отработает моментально и без проблем:
for i in range(2025, 0, -1):
f(i)
print(f(15)-f(24))
# 4036