返回文章列表
📁 Games

汉诺塔最少步数与递归公式 2ⁿ−1 详解

为什么汉诺塔最少步数是 2ⁿ−1?从 1 个盘子的 1 步推到 10 个盘子的 1023 步,用递归推导、步数表和 3–4 层实操演示讲透公式,还能在线玩汉诺塔验证。

✍️花花龙虾实验室⏱️ 8 分钟阅读

汉诺塔最少步数与递归公式 2ⁿ−1 详解

先说结论:n 个盘子的汉诺塔,最少需要 2ⁿ−1 步。1 个盘子 1 步,3 个盘子 7 步,10 个盘子 1023 步——这个精确到没有一点余地的答案,只需要一段很短的递归推理就能自己推导出来。这篇文章就带你把"为什么"彻底弄懂,再用在线汉诺塔亲手验证。

什么是最少步数(2ⁿ−1)

汉诺塔的规则只有三条:

  • 每次只能移动一个盘子;
  • 每次移动的是任意一根柱子最上面的盘子;
  • 大盘子任何时候都不能压在小盘子上。

在这三条规则下,把 n 个盘子从左柱全部搬到右柱,所需移动次数存在一个最小值,这个最小值就是 2ⁿ−1:

盘子数 n最少步数 2ⁿ−1
11
23
37
415
531
663
7127
8255
9511
101023

注意两点:其一,这不是"聪明人能更快"的经验值,而是可以被严格证明的下限,任何一步不多、一步不少的最优解都恰好是 2ⁿ−1 步;其二,步数随 n 翻倍增长,n 每加 1,步数大约翻一倍,这就是"指数爆炸"最直观的样子。

为什么是 2ⁿ−1:递归推导(配简单步骤)

想要搬 n 个盘子从 A 到 C,最后一个动作一定是:把最大的盘子(第 n 个)从 A 移到 C。而要让这个动作合法,必须先满足一个前提——上面 n−1 个盘子已经全部让路,整整齐齐地叠在中间柱 B 上。

于是整个搬运过程被切成三段:

  1. 先把上面 n−1 个盘子从 A 借助 C 搬到 B——这是一个规模为 n−1 的汉诺塔问题;
  2. 把最大的盘子从 A 直接到 C——1 步;
  3. 再把那 n−1 个盘子从 B 借助 A 搬到 C——又是一个规模为 n−1 的汉诺塔问题。

设 f(n) 是 n 个盘子的最少步数,翻译成递推式就是:

f(n) = 2·f(n−1) + 1,其中 f(1) = 1。

把这个式子逐层展开:

  • f(2) = 2×1 + 1 = 3
  • f(3) = 2×3 + 1 = 7
  • f(4) = 2×7 + 1 = 15
  • ……每往上一层,步数"翻倍再加一"。

为什么这个递推的解恰好是 2ⁿ−1?最直白的看法:每层都做一次"×2 再 +1",累积效果就是 1+2+4+…+2ⁿ⁻¹ = 2ⁿ−1(把 2ⁿ−1 加 1 再不断对半砍,每层恰好分掉一半,正好砍 n 层)。用数学归纳法说:假设 f(n−1) = 2ⁿ⁻¹−1,代入递推式得 f(n) = 2(2ⁿ⁻¹−1)+1 = 2ⁿ−1,结论对 n=1 成立且每步传递成立,所以对所有 n 成立。

同时也解释了"为什么不能再少":大盘子想走那关键的一步,上面的 n−1 个盘子无论躲在 B 还是 C,都必须先完整挪开一次,这至少要 f(n−1) 步;大盘子到位后它们还得再完整挪回来一次,又至少 f(n−1) 步。加上大盘子自己的 1 步,2·f(n−1)+1 一步都省不掉。

64 个盘子的世界末日传说

递推公式有个著名的"副产品"。传说梵天的神庙里有 3 根宝石柱和 64 个金盘,僧侣们日夜不停地按规则搬运,当 64 个盘子全部移完时,世界将在一声霹雳中终结。64 个盘子要移多少次?直接代入公式:

2⁶⁴−1 = 18,446,744,073,709,551,615 步

大约 1845 京(1.8×10¹⁹)。这个数字有多大?假设僧侣一秒移动一次、全年无休,一年约 3150 万秒,搬完需要约 5845 亿年——是当前宇宙年龄(约 138 亿年)的 40 多倍。所以"世界末日"倒是不必担心:世界先老去,盘子的搬运还没过半。

这也是理解指数增长的绝佳例子:从 n=1 的 1 步,到 n=64 的 1.8×10¹⁹ 步,唯一干的事就是"翻倍加一"重复了 63 次。

3–4 个盘子的实操演示

公式背得再熟,不如亲手搬一遍 3 层。下面是最优解的完整步骤(A=起点柱,B=辅助柱,C=目标柱):

3 盘(7 步)

  1. 小盘 A→C
  2. 中盘 A→B
  3. 小盘 C→B
  4. 大盘 A→C
  5. 小盘 B→A
  6. 中盘 B→C
  7. 小盘 A→C

可以对照一个口诀式规律:奇数个盘子时,第一步永远走向目标柱;偶数个盘子时,第一步走向辅助柱(3 盘走 C,4 盘走 B)。记住这个,你就能在不用背步骤的情况下走出最优路径——如果哪一步走错了,宁可撤销重来,也别让大盘子在错误的柱子上"扎了根"。

4 盘(15 步)

思路完全一样,只是"上面那一摞"从 2 个盘子变成 3 个盘子:

  1. 先把上面 3 个盘子按 3 盘最优解从 A 搬到 B(借助 C),共 7 步;
  2. 最大盘 A→C(第 8 步);
  3. 再把 3 个盘子从 B 搬到 C(借助 A),又 7 步。

4 盘的完整 15 步就是把 3 盘的 7 步做两遍,中间夹一次最大盘的移动。每一步移动的总是"当前可动的最小盘",跟着口诀走,15 步正好完成。

纸上推完,建议去在线汉诺塔实操:先 3 层再 4 层,开启步数统计,看看自己能否精确走出 7 步和 15 步。

常见错误

  • 来回晃小盘:小盘虽然最自由,但每一步都计入总数。最优解里相邻两步小盘必动、隔步必有意义,小盘连续来回 3 次基本意味着某一步已经走偏。
  • 把递归当成"同时移动一摞":递归描述的是任务划分,实际每一次仍然只能动一个盘子。"把 3 个盘子一起搬过去"不是合法的一步。
  • 开局就乱试:不看目标随手移动,往往把大盘子压进死角,最后不得不用远超 2ⁿ−1 的步数"解围"。移动前先问自己:这一步是不是在为"让最大的盘子腾路"服务?
  • 认为步数可以少于 2ⁿ−1:对标准三柱规则来说不存在捷径;网上"更少步数"的说法要么改了规则(多柱/允许跳步),要么是错的。
  • 大盘子提前上目标柱:只要还有比它小的盘子没就位,把它提前放上去通常意味着后面要"抬起来再放回"白费两步以上。

练习:亲手验证公式

打开汉诺塔在线游戏,按这个顺序练:

  1. 3 层模式走 7 步完成,尝试不看攻略盲走;
  2. 4 层模式走 15 步完成,重点感受"把 3 盘做两遍"的节奏;
  3. 挑战 5 层(31 步)、6 层(63 步),用口诀检验自己;
  4. 冲刺 8 层(255 步)以上,亲自体验指数增长的速度。

FAQ

Q1:2ⁿ−1 这个公式是怎么来的? 来自递归关系 f(n) = 2·f(n−1) + 1:搬 n 个盘子必须先把上面 n−1 个搬开(f(n−1) 步)、放下最大盘(1 步)、再把 n−1 个盖回去(f(n−1) 步)。对这个递推式用数学归纳法求解,即得 f(n) = 2ⁿ−1。

Q2:64 个盘子搬完真的会世界末日吗? 不会。那只是传说。64 盘需要 18,446,744,073,709,551,615 步,即使每秒移一次也要约 5845 亿年,远超宇宙年龄。末日传说只是古人用来形容这个数字庞大的方式。

Q3:有没有不用死记步骤的口诀或规律? 有。两条核心规律:① 奇数个盘子第一步移向目标柱,偶数个盘子第一步移向辅助柱;② 之后每一步都移动"当前能合法移动的盘子里最小的那个",并且不让它回到上一步的位置。跟着这两条,任何层数都能走出最优解。

Q4:递归思路怎么用到编程里? 伪代码只需三行:先把 n−1 个盘子从源柱搬到辅助柱(递归),再把最大盘从源柱移到目标柱(打印这一步),最后把 n−1 个盘子从辅助柱搬到目标柱(递归)。递归深度为 n,总调用次数正是 2ⁿ−1,和公式完全吻合。

Q5:4 个柱子的汉诺塔(Frame-Stewart 算法)步数会少吗? 会。多一根柱子能显著减少步数,例如 64 盘问题在四柱下的移动次数会远小于 2⁶⁴−1。但四柱问题的通用最优步数至今没有简单的封闭公式(Frame-Stewart 算法被证明对部分 n 最优),本文讨论的三柱版本才是公式 2ⁿ−1 成立的前提。

分享文章