1、什么是递归
简单地说,递归就是自己调用自己!
递归的本质,其实就是在分析一个大问题的时候,发现其子问题也是有相同的处理情况,而对于子问题来说,它的子问题也是如此,以此类推……
最经典的案例就是二叉树的深度遍历、快速排序、归并排序等,它们都是将一个大问题,根据每个子问题的共同特征抽象出一个解法之后,交给每个子问题去解决,最后子问题都解决了,那么大问题也就解决了!
2、如何理解递归
对于递归的理解,其实是可以分层次的,个人认为分为三个层次,由浅至深:
- 根据递归画出递归展开图分析
- 能够掌握递归的大部分题解操作
- 能够更加宏观的看待递归的过程:
- 不需要在意递归的细节展开图。
- 把递归函数当作一个一定可以完成想要任务的黑盒。
3、如何写好一个递归
- 先找到相同的子问题。也就是对函数参数以及返回值进行设计,看看这些子问题都共同需要完成什么任务。
- 只关心某一个子问题如何解决即可。也就是完成递归函数体的编写。
- 最后要注意一下递归函数的出口也就是终止条件。
Ⅱ. 搜索
1、各种搜索名词的介绍
我们可以看到在书上或者网上充斥着多种搜索的叫法,比如搜索、暴力搜索、深度优先遍历、深度优先搜索、广度优先遍历、广度优先搜索等等,看到这些名词会让人觉得很头疼,其实这就是叫法不统一的问题,实际上它们都是类似的!
搜索这个词,其实就等同于暴力搜索,因为暴力搜索就是直接暴力枚举出所有的情况,而搜索其实也是需要枚举出所有的情况的!
然后就是深度优先遍历以及深度优先搜索,也就是我们常常看到的 dfs,它和另一种方式广度优先遍历以及广度优先搜索是不一样的,这种称为 bfs,这里主要就是弄清楚搜索和遍历的区别,遍历是形式,而搜索是目的,但是我们在平时都可以认为它们是等价的!
2、拓展搜索问题
还有一些其它问题,我们也是可以使用搜索来解决的,就像经典的图问题、全排列问题,其实全排列的情况可以将其转化为树状图,将其看作是一棵决策树(听起来高级,其实就是按照不同的可能列举出不同的分支罢了),然后对决策树进行搜索即可!
Ⅲ. 回溯和剪枝
1、回溯的本质
简单地说,回溯其实就是深度优先遍历!它们俩其实是一样的,回溯的含义其实就是在遍历过程中,遇到条件不匹配的时候,就直接返回,不再继续往下递归,这种过程叫做回溯,可以明显发现深度优先遍历其实也是这样子的,所以它们是一样的,只不过回溯的含义针对一些深度优先遍历的题目的效果会比较明显!
2、剪枝的含义
剪枝其实就是如果在进行合法的回溯也就是深度优先遍历的时候,走了一些无意义的线路比如说不符合条件的线路,那么此时我们就在回溯条件中增加一些判断,有了这些判断条件之后,每次我们遇到这些不符合条件的线路的时候,就直接回溯了,而这些增加的条件,就叫做剪枝。
Ⅳ. 接下来的学习规划
- 专题一:递归
- 专题二:二叉树的深度优先遍历
- 专题三:深度优先遍历(不限于二叉树)
- 专题四:综合练习
- 专题五:**
FloodFill**算法 - 专题六:记忆化搜索(其实就是带备忘录的动态规划,动态规划和深度优先遍历其实是很相像的)