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