# !/usr/bin/env python # -*- coding:utf-8 -*- import sys from functools import wraps class TailRecurseException(BaseException): def __init__(self, args): self.args = args def tail_call_optimized(g): @wraps(g) def func(*args): f = sys._getframe() if f.f_back and f.f_back.f_back and f.f_back.f_back.f_code == f.f_code: raise TailRecurseException(args) else: while 1: try: return g(*args) except TailRecurseException as e: args = e.args func.__doc__ = g.__doc__ return func