递归、搜索和回溯
# 递归
# 什么是递归
自己调用自己:
例 1:二叉树的后序遍历 例 2:快排 例 3:归并
# 为什么用递归
本质:解决一个主问题时出现了一个相同的子问题,如此循环就可以使用递归,知道出现了无法分解的最小问题
# 怎么写递归
如何宏观看代递归过程:
不要在意递归的细节展开图
将递归函数当成一个黑盒
足够相信这个黑盒一定可以完成任务
先找到相同的子问题 --》函数头的设计
关心某一个子问题如何解决 --》函数体的设计
注意递归函数的结束
# 搜索
搜索分为两种:
- 深度优先搜索/深度优先遍历/dfs(递归、栈)
- 宽度优先搜索/宽度优先遍历/bfs(队列)
# 回溯与剪枝
回溯本质就是深搜 剪枝就是发现某种情况一定不行,直接除去情况
# 循环 vs 递归
循环和递归都是在处理重复的问题,二者可以相互转换,但是为什么有时候互相转换十分复杂?
什么时候用循环? 什么时候用递归?
一颗树进行深度搜索的话,复杂用递归;只有一个分支用循环简单