递归
是什么
- 搞懂递归非常重要:递归应用非常广泛,很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。
- 简单讲就是自己调自己
- 两个步骤:递--层层调用的过程;归--层层返回的过程
- 可以写出递推公式,如:
f(n) = f(n-1) + 1; f(n) = f(n-1) + f(n-2); f(n)=n*f(n-1);
为什么
- 优点:代码的表达力很强,写起来简洁。
- 缺点:空间复杂度高、有堆栈溢出风险、存在重复计算、过多的函数调用会耗时较多等问题。
怎么做
- 成立需三个条件:
- 一个问题的解可以分解为几个子问题的解
- 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
- 存在递归终止条件
- 如何编写递归代码?
写出递推公式,找到终止条件
编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤。
f(n)=f(n-1)+1 其中,f(1)=1
- 防止堆栈溢出:限制递归次数,超过次数报错退出
- 防止重复计算:利用缓存数据结构(如散列表)缓存计算过的项
- 调试递归:
1.打印日志发现,递归值。
2.结合条件断点进行调试。