递归初阶
递归的本质是函数调用自身。当问题可以分解为多个相同的子问题时,递归往往是最优雅的解决方案。
汉诺塔
参考题目: 信息学奥赛一本通 1205

思路分析
汉诺塔是递归的经典入门题。我们不妨从简单情况入手思考:
- n = 1:直接把盘子从 A 移到 C 即可。
- n = 2:先把上面的小盘移到 B(中转),再把大盘移到 C,最后把小盘从 B 移到 C。
- n = 3:我们可以把上面两个盘子看作一个整体。先把它移到 B,再把最底下的盘子移到 C,最后把那两个盘子从 B 移到 C。
以此类推,对于 n 个盘子,核心逻辑就是三步走:
- 将 x-1 个盘子从起点借助终点移动到中转点;
- 将第 x 个盘子直接从起点移动到终点;
- 将 x-1 个盘子从中转点借助起点移动到终点。
这里的关键在于理解'移动 x-1 个盘子'本身就是一个和原问题结构完全一致的子问题。

代码实现
#include <iostream>
#include <cstdio>
using namespace std;
int n;
char a, b, c;
// 将 x 个盘子从 begin 移动到 end,tmp 作为中转站
void move(int x, char begin, char tmp, char end) {
if (x == 0) return;
// 第一步:把上面的 x-1 个盘子移到中转柱
(x - , begin, end, tmp);
(, begin, x, end);
(x - , tmp, begin, end);
}
{
cin >> n >> a >> b >> c;
(n, a, c, b);
;
}




