Iteration for Factorials

Marco Mariani marco at sferacarta.com
Mon Oct 22 17:31:04 CEST 2007


 From the cookbook, this time.
It satisfies the requirements nicely  ;)


http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691



def tail_recursion(g):
     '''
     Version of tail_recursion decorator using no stack-frame 
inspection.
     '''
     loc_vars ={"in_loop":False,"cnt":0}

     def result(*args, **kwd):
         loc_vars["cnt"]+=1
         if not loc_vars["in_loop"]:
             loc_vars["in_loop"] = True
             while 1:
                 tc = g(*args,**kwd)
                 try:
                     qual, args, kwd = tc
                     if qual == 'continue':
                         continue
                 except (TypeError, ValueError):
                     loc_vars["in_loop"] = False
                     return tc
         else:
             if loc_vars["cnt"]%2==0:
                 return ('continue',args, kwd)
             else:
                 return g(*args,**kwd)
     return result


@tail_recursion
def factorial(n, acc=1):
     "calculate a factorial"
     if n == 0:
        return acc
     res = factorial(n-1, n*acc)
     return res




More information about the Python-list mailing list