如何精通汉诺塔
核心要点:汉诺塔由一条递归规则解决:要将 n 个圆盘移到目标柱,先将 n-1 个圆盘移到中间柱,再将最大圆盘移到目标柱,最后将 n-1 个圆盘移到顶部。在每个层级应用此规则,始终达到最少移动次数。最少移动次数始终是 2 的幂次减 1:3 个圆盘需要 7 步,4 个需要 15 步,5 个需要 31 步,6 个需要 63 步,7 个需要 127 步。
游戏介绍
汉诺塔以一叠圆盘开始,放在最左边的柱子上,最大的在底部,最小的在顶部。目标:将整叠圆盘移到最右边的柱子上,遵守两条规则:每次只移动一个圆盘;绝不将较大的圆盘放在较小的圆盘上。
就这些。没有计时器,没有随机性,没有隐藏信息。只有逻辑和步数预算。
PlayMemorize 的规模从 3 个圆盘扩展到 7 个圆盘。步数预算从最优最小值以上开始,让初学者在学习模式时仍能获胜;随着你的级别提升,预算会收紧到数学最小值。
最少移动次数:3 个圆盘 = 7 步,4 个 = 15 步,5 个 = 31 步,6 个 = 63 步,7 个 = 127 步。每个级别大约需要下一级别两倍再加一的步数。超过步数预算,本轮以失败告终。
递归算法
汉诺塔中的一切都遵循一个模式,在每个规模上反复应用:
将 n 个圆盘从 A 柱移到 C 柱,以 B 柱作为临时存储:
- 将 n-1 个圆盘从 A 移到 B(以 C 为临时)
- 将最大的圆盘从 A 移到 C
- 将 n-1 个圆盘从 B 移到 C(以 A 为临时)
这是完整的算法。在谜题的每个层级,你都在执行相同的三步结构。其精妙之处在于,步骤 1 和 3 本身也是同一个问题的较小实例,由同一条规则解决。
让我们用 3 个圆盘来具体演示。目标:将全部三个从第 1 柱移到第 3 柱。
- 步骤 1(将 2 个圆盘从第 1 柱移到第 2 柱):将圆盘 1 移到第 3 柱,将圆盘 2 移到第 2 柱,将圆盘 1 移到第 2 柱。
- 步骤 2(将圆盘 3 从第 1 柱移到第 3 柱):一步完成。
- 步骤 3(将 2 个圆盘从第 2 柱移到第 3 柱):将圆盘 1 移到第 1 柱,将圆盘 2 移到第 3 柱,将圆盘 1 移到第 3 柱。
共计:7 步。最优。
三阶段思维。在触碰任何圆盘之前,大声说出三个阶段:“将 n-1 个圆盘清到中间柱;将最大圆盘移到目标柱;在顶部重建 n-1 个圆盘。“在每个递归层级,你都在用更少一个圆盘重复同样的结构。你不是在记忆移动序列,而是在执行一个分形模式。
技巧:在做任何移动之前,问问自己:“我现在需要移动的最大圆盘是哪个?“在你移动那个圆盘之前的所有操作都是准备工作。保持这种框架能防止无目的的移动,让你保持在最优路径上。
为什么移动次数是固定的
最少移动次数直接来自算法。解决 n 个圆盘需要解决 n-1 个圆盘两次(步骤 1 和 3),再加上移动最大圆盘一次(步骤 2)。因此总次数 T(n) = 2 乘以 T(n-1) 加 1。以 T(1) = 1 展开:1、3、7、15、31、63、127,对应圆盘数 1 到 7。
每个数字都比 2 的幂次少 1。三个圆盘:8 减 1 = 7。四个:16 减 1 = 15。五个:32 减 1 = 31。六个:64 减 1 = 63。七个:128 减 1 = 127。
这不是巧合,而是每次解决 n 个圆盘时都需要解决 n-1 个圆盘两次的直接结果。理解这一点后,你就不再把汉诺塔看作一道靠猜测解决的谜题,而是把它看作一个需要执行的算法。
按难度的技巧
3 到 4 个圆盘(学习阶段): 在这个级别,步数预算宽裕。专注于在心里给每个圆盘命名·“小”、“中”、“大”·这样就不会混淆你的目标。在触碰任何东西之前,先梳理三个阶段。每局结束后,大声解释各阶段:“我把两个圆盘清到了中间,移动了大圆盘,再在顶部重建。“
技巧:最大的圆盘在完整解法中应该恰好移动一次。如果你发现自己想再次移动它,说明算法结构已经崩溃。回到三阶段框架,找出你偏离的地方。最大圆盘的单次移动是一个里程碑·之前的一切都是清路;之后的一切都是在顶部堆叠。
5 到 6 个圆盘(中级): 步数预算收紧。每一次多余的移动都要付出代价。在每个层级严格应用递归算法。当你从 n 递归到 n-1 个圆盘时,你的心理焦点应该转移:你现在在用不同的”源”、“目标”和”辅助”柱解决一个较小的汉诺塔谜题。追踪每个递归层级每根柱子扮演的角色。
辅助柱换位。在每个递归层级,一根柱子是源,一根是目标,一根是辅助。这些角色随着递归而轮换。将 n-1 个圆盘从第 1 柱移到第 2 柱时,第 3 柱是辅助。然后将 n-2 个圆盘从第 1 柱移到第 3 柱时,第 2 柱是辅助。有意识地追踪这种换位·这是 5 和 6 个圆盘时最常见的混乱来源。
7 个圆盘(挑战): 在 127 步最小值和紧张的预算下,你无法逐步思考。要按阶段思考。开始前,规划顶层结构:将 6 个圆盘移到中间(63 步),将最大圆盘移到右边(1 步),将 6 个圆盘移到右边(63 步)。然后以相同方式细分每个 6 圆盘阶段。这种自上而下的规划减轻认知负荷,防止你迷失在当前处于哪个阶段中。
注意:7 个圆盘时,尝试逐步记忆序列既不可靠又没必要。相信算法。当你在每个分支点应用递归规则时,正确的移动始终是确定的。怀疑和犹豫是消耗步数和耗尽预算的方式。
常见错误
把它当作试错谜题。 随机移动偶尔看起来有成效,但会累积成死路。汉诺塔是一个算法,不是一道靠实验破解的谜题。从你的思维中完全去除随机性。
迷失柱子角色。 在三根相同的柱子上,“源”、“目标”和”辅助”可能混淆,尤其是圆盘数量较多时。开始前,在脑海中明确标记柱子:左 = 起点,中 = 中间,右 = 目标。在每个递归层级始终使用这些标签。
移动最大圆盘超过一次。 在顶层递归中,最大圆盘恰好移动一次。如果你感到需要再次移动它,停下来·算法结构已经崩溃。回到三阶段框架,找出偏离的地方。
最大圆盘检查点。在每个递归层级,第 n 个圆盘应该恰好移动一次。完成第一个子阶段(将 n-1 个圆盘移到辅助柱)后,第 n 个圆盘应该空闲且未被移动。步骤 2 完成后,它应该在目标柱上。如果不是,你已经偏离了算法。
用完步数预算。 这只有在你没有遵循算法,或者在执行过程中心里”撤销”了移动(中途改变主意并尝试不同路径)时才会发生。坚持算法。它是最优的·没有更好的路径。
注意:一旦你使用递归算法决定了一个移动,就执行它。在执行过程中质疑会导致步数浪费。算法保证了最优性·相信它并毫不犹豫地执行。
练习计划
第一周·算法内化(3 个圆盘)。 每天玩 3 圆盘游戏。每局结束后,大声描述三个阶段。重复直到你对这个模式如此熟悉,能在第一步之前就叙述出整个解法。
第二周·扩展(4 到 5 个圆盘)。 转向 4 圆盘游戏。递归现在深入两层。每局结束后,追踪结构:“我递归到了 3,移动了大圆盘,再次递归。“在 4 圆盘玩三到四局后,转向 5 圆盘。
第三周·压力(6 个圆盘)。 6 个圆盘时,步数预算成为约束。以算法作为唯一指南进行游戏。目标是在最小值(63 步)的五步以内完成两局 6 圆盘游戏。追踪你的步数,观察它在这周逐渐接近 63。
第四周·精通(7 个圆盘)。 尝试 7 圆盘谜题。在触碰任何圆盘前应用自上而下的阶段规划。在 7 圆盘下连续三局胜利且步数接近 127,标志着真正的精通。
技巧:记录每个圆盘级别的步数。观察步数在练习中逐渐接近最小值,是递归模式正在内化的最清晰外部信号。7 圆盘超过 130 步说明仍有多余移动出现;在 135 以内且保持一致说明结构已经稳固。
汉诺塔是少数几款精通既是绝对的又是可测量的游戏之一。要么你知道递归算法并执行它,要么你不知道。一旦你知道,每个难度级别都向同样的逻辑屈服。放慢速度,说出你的阶段,相信算法,解法始终在那里。