汉诺塔怎么解?记住「最小盘固定方向转」就够了
汉诺塔是那种「听懂了递归也还是不会手动解」的题。
其实它有一条完全机械的走法,不需要在脑子里展开递归,两条规则循环执行就能最优解。这篇讲清规则、为什么最少步数一定是 2ⁿ−1、第一步该往哪放(这取决于盘数的奇偶),以及自动演示怎么用才有价值。
这是什么游戏
三根柱子,最左边那根从下往上套着 n 个由大到小的圆盘。
把整摞盘子搬到最右边那根柱子上,规则两条:
- 一次只能移动一个盘子(只能拿某根柱子最上面那个)。
- 大盘子永远不能压在小盘子上面。
盘数可选 3 到 8。屏幕上会显示当前步数和理论最少步数——后者就是你的目标。
规则与操作
拖动盘子到目标柱子,或者点一下源柱子、再点一下目标柱子。
| 按钮 | 做什么 |
|---|---|
| 新游戏 | 按当前盘数重新开始 |
| 重置 | 回到初始状态 |
| 自动演示 | 播放完整的最优解 |
违规的移动(大压小)会被拒绝,不计步数,所以不用怕点错。
新手第一局
选 3 个盘,然后照下面这两条循环走,不要想别的:
- 每隔一步,就移动一次最小的盘子,并且它总是朝同一个方向转。
- 另外那一步,是唯一一个合法的、不涉及最小盘的移动(只有一种可能,不用选)。
最小盘的方向取决于盘数:
| 盘数 | 最小盘的转动方向 |
|---|---|
| 奇数(3、5、7) | 左 → 右 → 中 → 左 …(朝目标柱那一侧循环) |
| 偶数(4、6、8) | 左 → 中 → 右 → 左 …(朝中间那根先走) |
3 个盘的完整走法(柱子记作 A 左、B 中、C 右,盘子记作 1 最小、3 最大):
第 1 步:1 → C (最小盘,奇数盘朝右)
第 2 步:2 → B (唯一的合法非最小盘移动)
第 3 步:1 → B (最小盘,继续朝右循环:C 的下一站是 B)
第 4 步:3 → C
第 5 步:1 → A
第 6 步:2 → C
第 7 步:1 → C 完成
七步,正好是 2³−1。你不需要预先想好这七步——每一步只做两件事之一:轮到最小盘就按方向挪它,否则找那个唯一合法的移动。全程不用思考。
在 3 个盘上走顺之后,直接上 5 个盘(31 步)。方法一模一样,只是循环次数变多。
进阶技巧
记住 2ⁿ−1。 3 盘 7 步,4 盘 15,5 盘 31,6 盘 63,7 盘 127,8 盘 255。每加一个盘,步数翻倍再加一——因为搬 n 个盘 = 搬走上面 n−1 个 + 挪最大的那个 + 再把 n−1 个搬回来。
每一步先确认「最小盘该不该动」。 这是整套方法唯一需要的判断。数一下已经走了几步:奇数步动最小盘,偶数步动别的。数错一步,后面全乱。
「唯一合法移动」真的唯一。 不涉及最小盘时,三根柱子里能动的只有两个盘(最小盘所在柱的下一个不算),而这两个之间只有小压大是合法的。所以你不需要选,扫一眼就知道。
自动演示是用来验证的,不是用来通关的。 走到一半觉得自己错了,点自动演示看它怎么走这一段,然后重置,自己再走一遍。直接看完整个演示学不到东西——手指的记忆比眼睛牢。
常见误区
试图在脑子里展开递归。 「先把上面两个搬到 B,再把最大的搬到 C……」——3 个盘还行,5 个盘就崩了。用上面那套机械规则,不要想递归。
忘了数步数。 「最小盘每隔一步动一次」的前提是你知道现在是第几步。数乱了就分不清该动谁,只能靠试——一试就破坏最优解。
最小盘换方向。 中途觉得「往这边更近」就改方向,整个循环立刻失效,步数会翻好几倍。方向一旦定了就不能变。
一上来选 8 个盘。 255 步,中间数错一次就前功尽弃。3 盘练熟规则、5 盘验证方法,再上大的。
常见问题
最少需要多少步?
2ⁿ−1 步,n 是盘数。3 盘 7 步,5 盘 31 步,8 盘 255 步。屏幕上会直接显示当前盘数的理论最少步数,拿它和你的实际步数比就知道有没有走弯路。
为什么是 2ⁿ−1?
搬 n 个盘,必须先把上面 n−1 个整体挪开(腾出最大盘的位置),搬走最大盘(1 步),再把那 n−1 个搬回最大盘上面。所以 f(n) = 2·f(n−1) + 1,从 f(1) = 1 推下去就是 2ⁿ−1。
第一步该往哪根柱子放?
看盘数的奇偶。奇数个盘(3、5、7)第一步把最小盘放到目标柱(最右边);偶数个盘(4、6、8)放到中间那根。放错了方向,虽然还能解,但步数会多出一大截。
自动演示会替我通关吗?
会——它播放的是完整最优解。但那样这一局就没意义了。更好的用法是走到卡住时看一小段,然后重置自己重走。