尾调用、尾递归

品味:

循环看成是一种特殊的尾递归函数


参考

http://www.ruanyifeng.com/blog/2015/04/tail-call.html

http://www.cnblogs.com/catch/p/3495450.html

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00137473836826348026db722d9435483fa38c137b7e685000


尾调用:函数调用语句位于外层函数即当前函数语义层面最后

尾递归:特殊的尾调用,被调函数为当前函数


从栈角度理解函数调用

开始调用:当前函数作用域入栈

调用结束:栈顶弹出


尾调用优化:

当仅当函数调用后续语句涉及到外部当前函数,才做压栈和弹栈操作


从栈角度理解递归函数,并借助栈改写为非递归函数

递归函数改写为,

while(栈非空 ||  递归边界条件为真)

{

if ~条件为真{

压栈

准备输入元素(递归函数调用语句)

}

else{

弹栈

操作(递归函数调用语句后续语句)

}

}

训练:参考实现二叉树三序递归访问非递归算法的改写


小结几句话

边界条件作为压栈弹栈条件

递归调用语句后有语句,才需压栈

递归调用语句转准备输入元素

递归调用语句后续语句为弹栈后相关操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值