本人的递归水平一直很烂 有一段时间不写代码 再写的时候 就会不自觉的避开递归的想法 并且日常作的题目 好比树或者图的DFS,或者backtracking DP等等 只要能避开递归就避开 久而久之,每次遇到一个新的题目,本身的思惟里面跟本就没有递归思想,或者就算知道这种应该递归作可是内心仍然在打怵,因此接下来就说一下最适合个人递归思路。数据结构
首先就不要怕 怕个锤子 不就是写错了嘛 又不是说递归必定是对的啥的。ide
首先啥是递归?
递归的能力在于用有限的语句来定义对象的无限集合。通常来讲,递归须要有边界条件、递归前进段和递归返回段。当边界条件不知足时,递归前进;当边界条件知足时,递归返回。函数
而后就是想想参数列表,这些参数 有些是咱们真正的输入,好比整个图的hashmap,有些参数 是咱们在递归的过程当中逐步构建,他们是最后的答案或者是答案的一部分,有些参数 是咱们的指针 用于遍历输入的map的指针。(有的时候 咱们在作图的题目的时候 会在参数列表中加上curNode这一项 而后还会加入seen/visited这一项)指针
而后想想这个函数是干吗的 虽然都叫dfs可是他只是一个空壳。这个时候找到等价关系式,就跟DP里面的公式同样。(先不要考虑corner case和递归终止条件)对象
而后再想想这个递归终止的条件是什么。咱们到底是要 返回void 仍是每次要尾递归 仍是不要尾递归。整体来讲状况有如下几种:咱们不返回void,可是咱们使用尾递归 或者 咱们不返回void,可是咱们使用提早递归 或者 咱们返回void 这样的话基本上是要提早终止或者最后终止(即return的位置)
注意 return和是否是用尾递归没啥关系 尾递归只是后return了一个当前递归函数而已,若是咱们这个递归函数返回void的话 就直接写递归函数就好了 根本不用return。递归
最后 有哪些东西用递归用的多呢?
链表原本是一个很好的用递归的数据结构 可是实际我写代码的时候不多用。
树:这个数据结构简直就是为递归量身打造的,除了BFS咱们推荐用Queue以外 其余的须要咱们前序中序后序遍历的时候要用递归(就是说 找路径的时候)
图:DFS的时候咱们最好也用递归
此外 还有 在构建 并查集的时候find()函数最好也用递归。hash