数据结构第二季 Day14 递归 、回溯

一、递归练习

1、上楼梯?(每次都过一下题目,感觉还是没理解透彻)

image.png
image.png

2、汉诺塔(Hanoi)?

image.png
image.png
  • 补充一个小插曲,如何判断递归基是要写一个还是两个?
  • 如果递归里面有 n-1 和 n-2,那么递归基就需要 if(n < 2)的情况;
  • 如果递归里面只有 n-1,那么递归基只要判断 n==1 的情况;

3、汉诺塔的时间复杂度和空间复杂度是多少?

image.png

4、递归函数的调用栈情况是怎么样的(脑海中要有个大概)?递归能转换成非递归吗?

image.png

5、递归转非递归的万能之法是什么?

  • 递归转非递归的万能之法
  • 自己维护一个栈,来保存参数、局部变量
  • 但是空间复杂度依然没有得到优化
image.png

6、从上述自定义栈帧思想,我们可以看出递归转非递归的核心在什么(细细品味,优化方向问题,很重要)?

  • 核心:尽量做到使用一组相同的变量来保存每个栈帧的内容
image.png

二、尾调用

1、什么是尾调用?什么是尾递归?

image.png
image.png

2、对于尾调用,编译器如果要进行优化,需要什么技术支持?尾调用能被优化的原因是什么?

  • 对于尾调用,编译器如果要进行优化,需要 能动态修改栈帧的长度
  • 尾调用能被优化,是因为尾调用的函数,不在使用当前栈帧的局部变量了,所以可以重复利用栈帧

3、为什么尾递归的优化比尾调用简单多了?要能简述尾递归优化思路?

image.png
  • 下图是未进行尾递归优化的汇编
image.png
  • 下图进行尾调用优化后的汇编代码
image.png

4、使用尾递归的思想优化斐波那契数列(了解即可)?

image.png

三、回溯(Back Tracking)

1、回溯(Back Tracking)的思想是什么?之前学过的什么搜索是典型的回溯应用?

image.png

2、八皇后问题描述?

image.png

3、八皇后解决思路?

image.png

4、 使用回溯法解决此问题的思路?(太神奇、太强了!)

image.png
image.png
image.png
image.png

你可能感兴趣的:(数据结构第二季 Day14 递归 、回溯)