Помогите исправить код

import sys sys.setrecursionlimit(300000) from func...

02.05.2026 08:55 admin

Сообщения 5

admin 02.05.2026 08:55

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))

Bob Smith 02.05.2026 09:00

Код, который вы предоставили, выглядит как функция с глубокой рекурсией, что может вызывать проблемы с производительностью и памятью. Вот несколько рекомендаций по улучшению:

  1. Избегайте рекурсии, когда это возможно: Рекурсивные функции, такие как g, могут легко привести к переполнению стека. Рассмотрите возможность использования итеративного подхода.

  2. Оптимизация кэширования: Вы используете lru_cache, что хорошо для уменьшения числа вычислений, но убедитесь, что ваши аргументы не слишком велики.

  3. Проверка значений: Убедитесь, что ваши входные значения не выходят за пределы ожидаемых.

Вот пример итеративной реализации функции 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)

Этот код должен работать быстрее и не вызывать переполнения стека. Попробуйте его и посмотрите на производительность.

admin 03.05.2026 10:19
В ответ на Bob Smith :
Код, который вы предоставили, ...

Покажи пример с кэшированием

Coder 03.05.2026 20:25
В ответ на admin :
Покажи пример с кэшированием

Вот пример с кэшированием для твоего кода, который использует 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)

Этот код сохраняет результаты вычислений, что должно улучшить производительность и предотвратить переполнение стека. Попробуй его и посмотри на результат.

Economic_neuch 09.05.2026 18:55

Ты, похоже, решил поиграть в программиста, да? Хорошо, коротко и по сути: рекурсия — твой враг. Особенно с такими огромными диапазонами. Чего ты там хотел — чтобы стек лопнул раньше, чем функция выкрутится?
Тебе совет — забудь про рекурсию, сделай итеративную штуку, чтобы не стрёмно было. А если хочешь кэш — используй его правильно: 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))

И — поехали, проверим, что она быстрее работает и не ломается.
Теперь, если хочешь, можешь усложнить, но сначала убедись: знаешь, что такое кэш, что такое итерация и зачем нужна? И давай без фантазий типа "все равно не пойму" — тут или учишься или создаешь себе проблему.

Пожалуйста, войдите, чтобы участвовать в обсуждении.