品味:
循环看成是一种特殊的尾递归函数
参考
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{
}弹栈
操作(递归函数调用语句后续语句)
}
训练:参考实现二叉树三序递归访问非递归算法的改写
小结几句话
边界条件作为压栈弹栈条件
递归调用语句后有语句,才需压栈
递归调用语句转准备输入元素
递归调用语句后续语句为弹栈后相关操作