Python

[Previous line repeated 996 more times] RecursionError: maximum recursion depth exceeded

Ребят, помогите кто сможет, сижу ломаю голову, задание из егэ, ну прросто не могу понять почему так выдает, пробывал по разному, как исправить ошибку?
def f(n):
if n==1:
return 1
if n>1:
return n*f(n-1)-1
print (f(1000)/f(997))


return (n*f(n-1)-1)
^^^^^^
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
В решениях учебных задач постоянны две вещи: свёртка арифметической прогрессии при помощи цикла и вычисление факториала при помощи рекурсии.

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

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

Можно, конечно, по совету, данному выше, лечить симптомы. Поставить глубину стека 2000, 5000, 100000 (правда, на онлайн сервисах даже этот рецепт не прокатит, кто вам там даст ковыряться в настройках). Это не решит принципиального вопроса: алгоритм довольно серьёзно ограничен по входным данным.

Поэтому вычисление факториала нужно делать через цикл.
 # вычисление n!
def fact(n):
if n k)

# вычисление n!/k!
def factQuotient(n, k):
if k >= n: return 1
p = n
for m in range(k + 1, n): p *= m
return p
Или функциональные версии:
 from math import prod

# вычисление n!
def fact(n):
return 1 if n < 2 else prod(range(2, n + 1))

# вычисление n!/k!
def factQuotient(n, k):
return 1 if n = end - 1: return start
mid = (start + end) // 2;
return multRange(start, mid) * multRange(mid, end)

# вычисление n! рекурсией
def factRec(n): return 1 if n < 2 else multRange(2, n + 1)

print(factRec(20000))
И замечательно получаем число на несколько страниц без всяких переполнений стека.
СК
Сергей Костромин
54 053
Лучший ответ
  1. не вижу отступов
  2. https://docs.python.org/3/library/sys.html#sys.setrecursionlimit
A(
Amir (F.c.b)
36 952
Слава Григорьев они есть
def f(n):
if n==1:
return 1
if n>1:
return n*f(n-1)-1
print (f(1000)/f(997))
маил ру не дает
Слава Григорьев def f(n):
if n==1:
return 1
if n>1:
return n*f(n-1)-1
print (f(1000)/f(997))