Pour obtenir les meilleurs résultats en revisitant la fin, créez une classe et effectuez une métaprogrammation en commençant par @. (réf: http://code.activestate.com/recipes/496691/)
tail_recursive.py
class tail_recursive (object):
  def __init__(self, func):
    self.func = func
    self.firstcall = True
    self.CONTINUE = object()
  def __call__(self, *arguments, **keywords):
    if self.firstcall:
      func = self.func
      CONTINUE = self.CONTINUE
      self.firstcall = False
      try:
        while True:
          result = func(*arguments, **keywords)
          if result is CONTINUE: # update arguments
            arguments, keywords = self.argskwd
          else: # last call
            return result
      finally:
        self.firstcall = True
    else: # return the arguments of the tail call
      self.argskwd = arguments, keywords
      return self.CONTINUE
Utilisez ceci comme @tail_recursive. Tatoheba Suivant:
@tail_recursive
def sum(n, acc=0):
  if n == 0:
    return acc
  else:
    return sum(n - 1, acc + n)
@tail_recursive Vous pouvez vous déplacer sans lui. Cependant, la pile déborde immédiatement.
Recommended Posts