Обратите внимание, что вы можете использовать свою функцию как есть, но вам нужно обеспечить, чтобы каждый свежий вызов не требовал повторения более нескольких сотен уровней до того, как он попал в кешированное значение или рекурсивный базовый случай; например,
f(n)
Я прибегал к этому порой ;-) В более общем плане вы могли бы написать функцию-обертку, которая многократно пытается RecursionError
, улавливает n
и отступает, называя ее со все меньшими значениями n
. Например,
def superf(n, step=400):
pending = []
while True:
pending.append(n)
try:
f(n)
break
except RecursionError:
n = max(n - step, 0)
while pending:
x = f(pending.pop())
return x
затем
>>> superf(100000)
5000050001