递归与回溯算法实战:汉诺塔、链表操作及快速幂
1. 汉诺塔问题
题目描述
有三根柱子,记为 A(起始柱)、B(辅助柱)、C(目标柱)。A 柱上有 n 个盘子,从小到大叠放。目标是将所有盘子从 A 移到 C,每次只能移动一个盘子,并且大盘子不能放在小盘子上面。
递归思想
基本情况
当 n = 1 时,直接将 A 最上面的盘子移到 C。
递归分解(n ≥ 2)
若要将 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());
}
private:
void dfs(vector<int>& a, vector<int>& b, vector<int>& c, int n) {
if (n == 1) {
c.push_back(a.back());
a.pop_back();
return;
}
// 将 n-1 个盘子从 A 移到 B,借助 C
dfs(a, c, b, n - 1);
// 将最大的盘子从 A 移到 C
c.push_back(a.back());
a.pop_back();
// 将 n-1 个盘子从 B 移到 C,借助 A
dfs(b, a, c, n - );
}
};


