通过分析三柱汉诺塔的递归求解过程,我们能够线性递推出移动nnn个盘子的最小移动次数
设三柱汉诺塔,移动nnn个盘子的最小移动次数为T(3,n)T(3, n)T(3,n)
T(3,n)={1n=12f(3,n−1)+1n>1
T(3,n)=\left\{
\begin{aligned}
& 1 & n=1 \\
& 2f(3,n-1) +1 & n > 1 \\
\end{aligned}
\right.
T(3,n)={12f(3,n−1)+1n=1n>1
由此可得T(3,n)=2n−1T(3,n) = 2^n - 1T(3,n)=2n−1
然而对于多柱汉诺塔问题,我们并没有一个非常直观的策略来移动圆盘。
首先考虑四柱汉诺塔的情况(又称Reve’s Puzzle),对四柱汉诺塔上移动nnn个盘子,可以通过分成如下333个步骤
- 将rrr个圆盘从AAA柱,通过CCC、DDD柱移动到BBB柱
- 将n−rn-rn−r个圆盘从AAA柱,通过CCC柱移动到DDD柱
- 将rrr个圆盘从BBB柱,通过AAA、CCC柱移动到DDD柱
那么我们的疑问是能够将111、333两个步骤作为子问题。通过一些简单的运算,我们发现对于较小的nnn,使用该方法的结果是正确的。
不加证明该递归算法的正确性,我们可以归纳递推式为
T(4,n)=min1≤r<n2T(4,n−r)+T(3,r)
T(4, n) = \min_{1 \leq r < n }{2T(4, n-r) + T(3, r)}
T(4,n)=1≤r<nmin2T(4,n−r)+T(3,r)
即
T(4,n)=min1≤r<n2T(4,n−r)+2r−1
T(4, n) = \min_{1 \leq r < n }{2T(4, n-r) + 2^r - 1}
T(4,n)=1≤r<nmin2T(4,n−r)+2r−1
产生的数列
T(4,i)=A007664=0,1,3,5,9,13,17,25,…
T(4, i) = A007664 = 0, 1,3,5,9,13,17,25,\dots
T(4,i)=A007664=0,1,3,5,9,13,17,25,…
对该数列进行差分,能够发现产生的数列为
A137688=1,2,2,4,4,4,8,8,8,8,⋯=20,21,21,22,22,22,…
A137688 = 1,2,2,4,4,4,8,8,8,8,\dots = 2^0, 2^1, 2^1, 2^2,2^2,2^2,\dots
A137688=1,2,2,4,4,4,8,8,8,8,⋯=20,21,21,22,22,22,…
因此我们可以在O(n)O(n)O(n)的时间内计算出T(4,n)T(4, n)T(4,n)的结果
对于圆柱的数量 m≥5m\geq5m≥5 的情况,我们是否可以继续使用递归的思路?
我们尝试继续使用333个步骤描述对mmm柱汉诺塔的移动方式:
- 将rrr个圆盘从AAA柱,通过m−2m-2m−2根圆柱移动到BBB柱
- 将n−rn-rn−r个圆盘从AAA柱,通过其他m−3m-3m−3根圆柱移动到mmm柱
- 将rrr个圆盘从BBB柱,通过m−2m-2m−2根圆柱移动到mmm柱
在这种移动过程中,我们会产生一些疑问,如:我们是否可以进行如下操作
- 将r’r’r’个圆盘从AAA柱,通过m−3m-3m−3根圆柱移动到BBB柱、CCC柱
- 将n−r’n-r’n−r’个圆盘从AAA柱,通过其他m−4m-4m−4根圆柱移动到mmm柱
- 将r′r'r′个圆盘从BBB柱、CCC柱,通过m−3m-3m−3根圆柱移动到mmm柱
这样的话,111、333两个步骤就难以通过递归方式描述,因为这把r’r’r’个圆盘放到了两根(甚至更多根)圆柱上
但是我们稍加考虑,假设我们移到BBB柱上的数量为rBr_BrB,本质上与我们在之前方案上先移动rBr_BrB个圆盘,再移动n−rBn-r_Bn−rB个圆盘到mmm柱上的方案是等价的。
这333个步骤已经是Frame-Stewart算法的主要思想,我们在利用公式简要地描述:
T(m,n)=min1≤r<n2T(m,n−r)+T(m−1,r)
T(m,n) = \min_{1 \le r < n}2T(m,n-r)+T(m-1,r)
T(m,n)=1≤r<nmin2T(m,n−r)+T(m−1,r)
对此,除m=3,4m=3,4m=3,4的情况外,我们需要O(mn2)O(mn^2)O(mn2)的时间复杂度计算mmm柱汉诺塔问题,含有nnn个圆盘时的最少移动次数。

本文深入探讨了汉诺塔问题的解决策略,包括三柱、四柱及多柱汉诺塔的递归求解方法。详细分析了移动盘子的最小次数,并介绍了Frame-Stewart算法在多柱汉诺塔问题中的应用。
12

被折叠的 条评论
为什么被折叠?



