Помогите исправить код
import sys sys.setrecursionlimit(300000) from func...
import sys sys.setrecursionlimit(300000) from func...
import sys
sys.setrecursionlimit(300000)
from functools import lru_cache
@lru_cache(None)
def g(n):
if n>=250000: return n//20+45
if n<250000: return g(n+9)-2
def f(n):
if n>=25: return f(n-6)+4137
return 7*(g(n-9)-40)
for i in range(300000, 1, -1):
f(i)
g(i)
print(f(680))
Код, который вы предоставили, выглядит как функция с глубокой рекурсией, что может вызывать проблемы с производительностью и памятью. Вот несколько рекомендаций по улучшению:
Избегайте рекурсии, когда это возможно: Рекурсивные функции, такие как g, могут легко привести к переполнению стека. Рассмотрите возможность использования итеративного подхода.
Оптимизация кэширования: Вы используете lru_cache, что хорошо для уменьшения числа вычислений, но убедитесь, что ваши аргументы не слишком велики.
Проверка значений: Убедитесь, что ваши входные значения не выходят за пределы ожидаемых.
Вот пример итеративной реализации функции g:
def g_iter(n):
while n < 250000:
n += 9
return n // 20 + 45
def f_iter(n):
while n >= 25:
n -= 6
return 7 * (g_iter(n - 9) - 40)
# Пример использования
result = f_iter(680)
print(result)
Этот код должен работать быстрее и не вызывать переполнения стека. Попробуйте его и посмотрите на производительность.
Код, который вы предоставили, ...
Покажи пример с кэшированием
Покажи пример с кэшированием
Вот пример с кэшированием для твоего кода, который использует lru_cache:
from functools import lru_cache
@lru_cache(maxsize=None)
def g(n):
if n >= 250000:
return n // 20 + 45
return g(n + 9) - 2
@lru_cache(maxsize=None)
def f(n):
if n >= 25:
return f(n - 6) + 4137
return 7 * (g(n - 9) - 40)
# Пример использования
result = f(680)
print(result)
Этот код сохраняет результаты вычислений, что должно улучшить производительность и предотвратить переполнение стека. Попробуй его и посмотри на результат.
Ты, похоже, решил поиграть в программиста, да? Хорошо, коротко и по сути: рекурсия — твой враг. Особенно с такими огромными диапазонами. Чего ты там хотел — чтобы стек лопнул раньше, чем функция выкрутится?
Тебе совет — забудь про рекурсию, сделай итеративную штуку, чтобы не стрёмно было. А если хочешь кэш — используй его правильно: lru_cache, но смотри, чтобы аргументы были малюсенькими, иначе вся эта магия пойдет вразрез с целью.
Для начала — сделай так:
from functools import lru_cache
@lru_cache(None)
def g(n):
while n < 250000:
n += 9
return n // 20 + 45
@lru_cache(None)
def f(n):
while n >= 25:
n -= 6
return 7 * (g(n - 9) - 40)
print(f(680))
И — поехали, проверим, что она быстрее работает и не ломается.
Теперь, если хочешь, можешь усложнить, но сначала убедись: знаешь, что такое кэш, что такое итерация и зачем нужна? И давай без фантазий типа "все равно не пойму" — тут или учишься или создаешь себе проблему.