前言
递归是一种在算法中广泛应用的思想,其主体思想是通过将复杂的问题分解为更简单的子问题来求解。具体而言,递归通常包括以下几个要素:
- 基本情况(Base Case):每个递归算法必须有一个或多个基本情况,用于定义何时停止递归。基本情况是问题的
最小实例,直接返回结果,不再进行进一步的递归。 - 递归情况(Recursive Case):当问题不是
基本情况时,递归算法会将问题拆分成更小的子问题。算法会调用自身来解决这些子问题,通常会在调用中传递参数以反映问题的简化。 - 合并结果(Combining Results):在递归调用返回后,算法
会将子问题的结果合并,以得到原始问题的解。
递归的优势在于其代码通常更简洁且易于理解,尤其是在处理分治问题(如排序、搜索等)时。然而,递归也可能导致栈溢出问题,因为每次调用都会在栈上占用空间,因此在使用时需要考虑调用深度和性能优化。
以下是相关习题解析。
1. 汉诺塔(easy)
题目链接:汉诺塔
递归函数流程:
- 当前问题规模为 n=1 时,直接将 A 中的最上面盘子挪到 C 中并返回;
- 递归将 A 中最上面的 n-1 个盘子挪到 B 中;
- 将 A 中最上面的一个盘子挪到 C 中;
- 将 B 中上面 n-1 个盘子挪到 C 中。
解题思路:
- 先把
n-1 盘全部移到B上去 - 再把
第 n 盘移到C上去 - 再把
n-1盘移到C上去
代码如下:
class Solution {
public:
void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
dfs(A, B, C, A.size());
}
void dfs(vector<int>& A, vector<int>& B, vector<int>& C, int n) {
if (n == 1) {
C.push_back(A.back());
A.pop_back();
;
}
(A, C, B, n - );
C.(A.());
A.();
(B, A, C, n - );
}
};


