3 ms·
For tail recursion, you can use this snippet of code: class Recurse(Exception): def __init__(self, *args, **kwargs): self.args = args
by linkdd 3y ago
For tail recursion, you can use this snippet of code:
class Recurse(Exception):
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
class Terminate(Exception):
def __init__(self, retval):
self.retval = retval
def tailrec(func):
def wrapper(*args, **kwargs):
while True:
try:
func(*args, **kwargs)
except Recurse as r:
args = r.args
kwargs = r.kwargs
except Terminate as t:
return t.retval
return wrapper
@tailrec
def fact(n, acc=1):
if n == 0:
raise Terminate(acc)
else:
raise Recurse(n - 1, acc * n)
Of course, it will be slow because it relies on exceptions :P
- _aavaa_ 3y agoYou can do a similar thing (that's around 2-3x faster) with a trampoline: def factorial(n): res = fac(n) while callable(res): res = res() return res def fac(n, acc=1): if n == 1: return acc else: return lambda: fac(n-1, n*acc)
- deleted 3y ago[deleted]