标签:ext ref parent OWIN cat rgs code href blank
总所周知,尾递归是一种特殊的递归;因为这一次递归返回的下一次的结果,所以避免了递归栈,对于空间上来讲是一种节省。
所有的递归都有非递归来书写,尾递归也可以达到和非递归相同的结果。
但是python是不支持尾递归的,因为要返回错误栈和错误类型。
python 默认的递归栈大小可以通过以下获得
sys.getrecursionlimit()
python 可以设置递归栈的大小
sys.setrecursionlimit()
但是今天的我大开眼界。
https://www.cnblogs.com/Alexander-Lee/archive/2010/09/16/1827587.html
import sys class TailRecurseException: def __init__(self, args, kwargs): self.args = args self.kwargs = kwargs def tail_call_optimized(g): """ This function decorates a function with tail call optimization. It does this by throwing an exception if it is it‘s own grandparent, and catching such exceptions to fake the tail call optimization. This function fails if the decorated function recurses in a non-tail context. """ def func(*args, **kwargs): 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, kwargs) else: while 1: try: return g(*args, **kwargs) except TailRecurseException, e: args = e.args kwargs = e.kwargs func.__doc__ = g.__doc__ return func
大意是通过不断的捕获错误规避了递归栈。6的一批,大开眼界。
标签:ext ref parent OWIN cat rgs code href blank
原文地址:https://www.cnblogs.com/mangmangbiluo/p/13063088.html