递归与搜索算法实战:汉诺塔、链表操作及快速幂
在算法学习中,递归是理解分治思想的关键。本文将通过五个经典题目,从汉诺塔的递归分解到链表的节点操作,再到快速幂优化,梳理核心逻辑与代码实现。
涉及题目
1. 汉诺塔问题
问题描述
有三根柱子 A(起始)、B(辅助)、C(目标)。A 柱上有 n 个盘子,从小到大叠放。目标是将所有盘子移到 C,每次只能移动一个,且大盘子不能放在小盘子上面。
递归思路
汉诺塔的核心在于将规模为 n 的问题拆解为 n-1 的子问题:
- 终止条件:当
n = 1时,直接将 A 顶部的盘子移至 C。 - 递归分解:若
n ≥ 2,先将 A 上除最底层的 n-1 个盘子移至 B(借助 C),再将 A 最底层的大盘子移至 C,最后将 B 上的 n-1 个盘子移至 C(借助 A)。
代码实现
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.();
;
}
(a, c, b, n - );
c.(a.());
a.();
(b, a, c, n - );
}
};


