一、单Hanoi塔
上图为 3 阶 Hanoi 塔
假设有三个命名为 A B C 的塔座 ,在塔座A上插有n个直径大小不相同,由小到大编号为1 ,2 ,3 ,··· ,n的圆盘,要求将A座上的圆盘移至塔座C
并按同样的顺序叠排
圆盘移动必须遵守下列规则:
1、每次只能移动一个圆盘 。
2、圆盘可以插在任意一个塔座上 。
3、任何时刻都不能将一个较大的圆盘放在一个较小的圆盘上。
问把所有的圆盘从A柱移动到C柱总计需要多少次移动?
一种递归的求解方法是分三步解决这个问题。
第一步:使用同样的方法将n-1个盘子从A柱移动到B柱;
第二步:利用1次移动将最下面的大盘子从A柱移动到C柱;
第三步:还是用第一步的方法将B柱上的n-1个盘子移到C柱,用伪码描述如下:
算法:Hanoi(A,C,n)
if n=1 then move(A,C)
else Hanoi(A,B,n-1)
move(A,C)
Hanoi(B,C,n-1)
使用这个算法,设总的移动次数为T(n),行2与行4有两次递归调用,每次调用的输入实例规模是n-1,因此移动次数为T(n-1),行3有1次移动,从而得到如下递推方程:
T(n) = 2 T(n-1) + 1
初值 T(1) = 1
T(n) = 2 T(n-1) + 1
T(n-1) = 2 T(n-2) + 1
......
T(2) = 2 T
T(1) = 1
T(n) = 2( 2 T(n-2) +1 ) + 1 = 2 ² T(n-2) + 2 + 1 = 2^(n-1) T(1) + 1 = 2^(n-1) + 1
所以移动次数为2^(n-1) + 1次
二、双Hanoi塔
双Hanoi塔问题是Hanoi塔问题的一种推广,与Hanoi塔的不同点在于:2n个圆盘,分成大小不同的n对,每对圆盘完全相同。初始,这些圆盘按照从大到小的次序从下到上放在A柱上,最终要把他们全部移到C柱,移动的规则与Hanoi塔相同。
(1)设计一个移动的算法并给出伪码描述。
(2)计算你的算法所需要的移动次数。
解:
(1)算法设计思想:分治策略。先递归地将上面的2(n-1)个盘子从A柱移动到B柱;用2次移动将最大的2个盘子从A柱移动到C柱;递归地将B柱的2(n-1)个盘子从B柱移动到C柱。
伪码描述是:
BiHanoi(A,C,n) //从A到C移动2n只盘子
if n=1 then BiMove(A,C) //从A到C移动2只盘子
else BiHanoi(A,B,n-1)
BiMove(A,C)
BiHanoi(B,C,n-1)
(2)设2n个盘子的移动次数是T(n),则第2行和第4行的递归调用的子问题规模是n-1,第3行是2次移动,于是有
T (n) = 2 T(n-1) + 2
T(1) = 2
解得 T(n) = 2^(n+1) -2