递归:函数自己调用自己
为什么要用到递归:
递归的本质:处理最开始问题的逻辑和处理后面的问题的逻辑是相同的
主问题 --> 相同的子问题
子问题 --> 相同的子问题
如何理解递归?
1.递归展开的细节图
2.二叉树中的题目
3.宏观看代递归的过程
3.1不要在意递归的细节展开图
3.2 把递归的函数当作一个黑盒 --> 不关注具体的操作
3.3相信这个黑盒一定能完成这个任务
4.如何写好一个递归?
4.1先找到相同的子问题 --> 函数头的设计、
4.2只关注子问题的具体实现 --> 函数体的实现
4.3注意一下递归函数的出口
深度优先遍历 vs 深度优先搜索(dfs)
遍历是形式,目的是为了搜索
宽度优先遍历vs 宽度优先搜索(bfs)
搜索就是将所有的情况都暴力枚举一遍
回溯
回溯的本质就是深搜
解决迷宫问题
从起始点开始走,只要遇到路口, 所有方式都走一遍。当发现走到死路之后,就回退到上一步(其实这就是回溯,回退的操作就是回溯)
剪枝:比如在迷宫问题中,当我们走到死路之后,回退到上一个路口,这时候就可以排除刚刚走过的路口。排除掉了一个错误,这就是剪枝。之前通过这个路口有两种可能的走法,但是我选择了一种发现走到死路之后,再次回来之后,就可以回退到这个路口,并且减少一种可能性。