克服递归带来的恐惧感

本人的递归水平一直很烂 有一段时间不写代码 再写的时候 就会不自觉的避开递归的想法 而且平常做的题目 比如树或者图的DFS,或者backtracking DP等等 只要能避开递归就避开 长此以往,每次遇到一个新的题目,自己的思维里面跟本就没有递归思想,或者就算知道这种应该递归做但是心里仍然在打怵,所以接下来就说一下最适合我的递归思路。

首先就不要怕 怕个锤子 不就是写错了嘛 又不是说递归一定是对的啥的。

首先啥是递归?
递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

然后就是想一想参数列表,这些参数 有些是我们真正的输入,比如整个图的hashmap,有些参数 是我们在递归的过程中逐步构建,他们是最后的答案或者是答案的一部分,有些参数 是我们的指针 用于遍历输入的map的指针。(有的时候 我们在做图的题目的时候 会在参数列表中加上curNode这一项 然后还会加入seen/visited这一项)

然后想一想这个函数是干嘛的 虽然都叫dfs但是他只是一个空壳。这个时候找到等价关系式,就跟DP里面的公式一样。(先不要考虑corner case和递归终止条件)

然后再想一想这个递归终止的条件是什么。我们究竟是要 返回void 还是每次要尾递归 还是不要尾递归。总体来说情况有以下几种:我们不返回void,但是我们使用尾递归 或者 我们不返回void,但是我们使用提前递归 或者 我们返回void 这样的话基本上是要提前终止或者最后终止(即return的位置)
注意 return和是不是用尾递归没啥关系 尾递归只是后return了一个当前递归函数而已,如果我们这个递归函数返回void的话 就直接写递归函数就行了 根本不用return。

最后 有哪些东西用递归用的多呢?
链表本来是一个很好的用递归的数据结构 但是实际我写代码的时候很少用。
树:这个数据结构简直就是为递归量身打造的,除了BFS我们推荐用Queue之外 其他的需要我们前序中序后序遍历的时候要用递归(就是说 找路径的时候)
图:DFS的时候我们最好也用递归
此外 还有 在构建 并查集的时候find()函数最好也用递归。

posted @ 2020-12-05 00:37  EvanMeetTheWorld  阅读(49)  评论(0)    收藏  举报