#!/usr/bin/python
from inspect import isfunction
recur = 0
def loop(func):
def inner(a,b):
global recur
old_recur = recur
recur = lambda a,b: lambda:func(a,b)
ret = func(a,b)
while isfunction(ret):
ret = ret()
recur = old_recur
return ret
return inner
Which creates a nice decorator:
@loop
def foo(n, a):
if n == 0:
return a
else:
return recur(n-1,a*n)
print(foo(6,1))