对尾递归的理解

  1. 递归,在程序运行过程中调用自己,每一级递归都需要调用函数,会创建新的栈空间,随着递归深度的增加,创建的栈越来越多,造成栈的爆炸

  2. 尾递归基于函数的尾调用,每一级调用直接返回函数的返回值更新调用栈,而不是创建新的调用栈,类似迭代的实现,时间和空间上均优化了一般的递归

  3. 存在的问题,python不支持尾递归,递归深度超过1000时会报错

  4. 有人对python的尾递归写了一个优化版,让python突破递归调用1000次的限制

  5. 实现一个 tail_call_optimized 装饰器,通过装饰器来在每次递归调用函数前,抛出了一个异常,然后将这次调用的参数写进异常对象,再再蹦床函数里捕获这个异常,并将参数读出来,然后进行迭代调用。

  6. 在递归函数调用时,先插入一个 trampolining(蹦床) 函数。在用这个蹦床函数来调用真正的递归函数,并且修改递归函数的函数体,不让它再次进行递归的函数调用,而是直接返回下次递归调用的参数,由蹦床函数来进行下一次递归调用。这样一层一层的递归调用就会变成由蹦床函数一次一次的迭代式函数调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值