尾递归,

总所周知,尾递归是一种特殊的递归;因为这一次递归返回的下一次的结果,所以避免了递归栈,对于空间上来讲是一种节省。

所有的递归都有非递归来书写,尾递归也可以达到和非递归相同的结果。

但是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的一批,大开眼界。

posted @ 2020-06-07 23:48  茫茫碧落  阅读(120)  评论(0编辑  收藏  举报