本文精选了五个经典的递归与搜索算法题目,涵盖汉诺塔、链表操作及快速幂。通过 C++ 代码示例,深入解析递归思想的拆解逻辑与指针操作的细节。
1 汉诺塔问题
题目描述

有三根柱子 A(起始)、B(辅助)、C(目标)。A 柱上有 n 个盘子,从小到大叠放。目标是将所有盘子从 A 移到 C,每次只能移动一个盘子,且大盘子不能放在小盘子上面。
递归思想
解决这个问题的关键在于将大规模问题分解为小规模子问题。
- 基本情况:当
n = 1时,直接将 A 最上面的盘子移到 C。 - 递归分解:若要将 A 上的 n 个盘子移到 C,可分解为三步:
- 将 A 上除了最底下的盘子(即上面 n-1 个)移到 B(借助 C 作为辅助)。
- 将 A 最底下的最大盘子移到 C。
- 将 B 上的 n-1 个盘子移到 C(借助 A 作为辅助)。
这样,规模为 n 的问题就被拆分为两个规模为 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 - );
}
};





