# !/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