一、递归练习
1、上楼梯?(每次都过一下题目,感觉还是没理解透彻)
image.png image.png2、汉诺塔(Hanoi)?
image.png image.png- 补充一个小插曲,如何判断递归基是要写一个还是两个?
- 如果递归里面有 n-1 和 n-2,那么递归基就需要 if(n < 2)的情况;
- 如果递归里面只有 n-1,那么递归基只要判断 n==1 的情况;
3、汉诺塔的时间复杂度和空间复杂度是多少?
image.png4、递归函数的调用栈情况是怎么样的(脑海中要有个大概)?递归能转换成非递归吗?
image.png5、递归转非递归的万能之法是什么?
- 递归转非递归的万能之法
- 自己维护一个栈,来保存参数、局部变量
- 但是空间复杂度依然没有得到优化
6、从上述自定义栈帧思想,我们可以看出递归转非递归的核心在什么(细细品味,优化方向问题,很重要)?
- 核心:尽量做到使用一组相同的变量来保存每个栈帧的内容
二、尾调用
1、什么是尾调用?什么是尾递归?
image.png image.png2、对于尾调用,编译器如果要进行优化,需要什么技术支持?尾调用能被优化的原因是什么?
- 对于尾调用,编译器如果要进行优化,需要
能动态修改栈帧的长度
- 尾调用能被优化,是因为尾调用的函数,不在使用当前栈帧的局部变量了,所以可以重复利用栈帧
3、为什么尾递归的优化比尾调用简单多了?要能简述尾递归优化思路?
image.png- 下图是未进行尾递归优化的汇编
- 下图进行尾调用优化后的汇编代码
网友评论