汉诺塔

进阶

汉诺塔是理解递归拆解与状态转移的教科书例子。

汉诺塔

演示将所有盘子从 A 柱移到 C 柱的递归过程。

AlgoAnim · 汉诺塔

待机

速度
待机
// 源代码
1void hanoi(int n, char from, char buffer, char to) {
2    if (n == 0) return;
3    hanoi(n - 1, from, to, buffer);
4    cout << from << " -> " << to << "\n";
5    hanoi(n - 1, buffer, from, to);
6}

复杂度分析

时间 O(2^n)
空间 O(n)
最优 O(1)
最坏 O(2^n)

算法讲解

把 n 个盘子从 A 搬到 C,看似复杂,但递归视角下可以拆成"先搬上面 n-1 个、再搬最大盘、再搬回 n-1 个"。

这道题最适合训练"函数相信子问题会被正确解决"的递归思维,而不是自己在脑中硬推所有步骤。

它还天然呈现出递归树和调用栈的增长方式,因此非常适合做可视化内容。

总步数是 2^n - 1,也提醒我们递归优雅不代表复杂度一定低。