数据结构第二季 Day14 递归 、回溯
2021-10-19 本文已影响0人
望穿秋水小作坊
一、递归练习
1、上楼梯?(每次都过一下题目,感觉还是没理解透彻)
![](https://img.haomeiwen.com/i13946897/9a19c6df87156372.png)
![](https://img.haomeiwen.com/i13946897/7ee748aaab723841.png)
2、汉诺塔(Hanoi)?
![](https://img.haomeiwen.com/i13946897/e0e74c70cb17f742.png)
![](https://img.haomeiwen.com/i13946897/9b2e8a42cfbc62dc.png)
- 补充一个小插曲,如何判断递归基是要写一个还是两个?
- 如果递归里面有 n-1 和 n-2,那么递归基就需要 if(n < 2)的情况;
- 如果递归里面只有 n-1,那么递归基只要判断 n==1 的情况;
3、汉诺塔的时间复杂度和空间复杂度是多少?
![](https://img.haomeiwen.com/i13946897/03ae4e76cc6c9818.png)
4、递归函数的调用栈情况是怎么样的(脑海中要有个大概)?递归能转换成非递归吗?
![](https://img.haomeiwen.com/i13946897/d9755d39574984aa.png)
5、递归转非递归的万能之法是什么?
- 递归转非递归的万能之法
- 自己维护一个栈,来保存参数、局部变量
- 但是空间复杂度依然没有得到优化
![](https://img.haomeiwen.com/i13946897/2a58d50fbfa1b9a1.png)
6、从上述自定义栈帧思想,我们可以看出递归转非递归的核心在什么(细细品味,优化方向问题,很重要)?
- 核心:尽量做到使用一组相同的变量来保存每个栈帧的内容
![](https://img.haomeiwen.com/i13946897/e94d476e95db4462.png)
二、尾调用
1、什么是尾调用?什么是尾递归?
![](https://img.haomeiwen.com/i13946897/bd065232fe91cae0.png)
![](https://img.haomeiwen.com/i13946897/2f96ce10f71e3368.png)
2、对于尾调用,编译器如果要进行优化,需要什么技术支持?尾调用能被优化的原因是什么?
- 对于尾调用,编译器如果要进行优化,需要
能动态修改栈帧的长度
- 尾调用能被优化,是因为尾调用的函数,不在使用当前栈帧的局部变量了,所以可以重复利用栈帧
3、为什么尾递归的优化比尾调用简单多了?要能简述尾递归优化思路?
![](https://img.haomeiwen.com/i13946897/0fca2e03a2545f1e.png)
- 下图是未进行尾递归优化的汇编
![](https://img.haomeiwen.com/i13946897/3b0608c06c26eb58.png)
- 下图进行尾调用优化后的汇编代码
![](https://img.haomeiwen.com/i13946897/58e9ce037654571a.png)
4、使用尾递归的思想优化斐波那契数列(了解即可)?
![](https://img.haomeiwen.com/i13946897/ebba186ca7e51ad3.png)
三、回溯(Back Tracking)
1、回溯(Back Tracking)的思想是什么?之前学过的什么搜索是典型的回溯应用?
![](https://img.haomeiwen.com/i13946897/2b2e24708f47e56b.png)
2、八皇后问题描述?
![](https://img.haomeiwen.com/i13946897/335dc2d738672270.png)
3、八皇后解决思路?
![](https://img.haomeiwen.com/i13946897/c6c55de0ed4a6a09.png)
4、 使用回溯法解决此问题的思路?(太神奇、太强了!)
![](https://img.haomeiwen.com/i13946897/e3efa92a01ed4452.png)
![](https://img.haomeiwen.com/i13946897/177f53153781464a.png)
![](https://img.haomeiwen.com/i13946897/15dd151b14864a75.png)
![](https://img.haomeiwen.com/i13946897/d4e6e57e2f21faae.png)