假设A上只有两个圆盘a1,a2(a1比a2小),则只需将a1移动到B,再将a2移动到C,最后将a1移动到C即可。
如果A中有N个盘子,则将N-1个盘子看作整体,就能类比上面两个盘的情况。
于是解法为:将N-1个盘子通过移动到B
将A中剩下的一个盘子移动到C
最后将N-1个盘子移动到C
最后将B中的N-1个盘子移动到C的过程中,我们可以忽略已经移动到C的那一个最大的盘子。这样问题就变成了将B中的N-2个盘子移动到C。这个问题显然和初始问题(将A中的N个盘子移动到C)本质上没有区别。
我们把ABC的表达方式换成起始柱,工具柱,目标柱。
这样B中的N-2个盘子移动到C:此时初始柱变为B,工具柱变为B,目标柱变为C。
则解法可以写成:
将起始柱上的N-1个盘子通过目标柱移动到工具柱
将起始柱剩下的一个盘子直接移动到目标柱
(忽略放好的最大的盘子)将起始柱的N-2个盘子通过目标柱移动到工具柱
将起始柱剩下的一个盘子直接移动到目标柱
......接着不断重复一样的过程
程序:
void Hanoi(int n,char A,char B,char C)
{
if(n==1) move(A,1,C);
else
{
Hanoi(n-1,A,C,B);//C为工具柱
move(A,n,C);
Hanoi(n-1,B,A,C);//A为工具柱
}
}
第八行代码:Hanoi(n-1,B,A,C); //A为工具柱
带入void Hanoi(int n ,char A,char B,char C)
执行过程为:Hanoi(n-2,B,C,A);//将n-2个盘子从B通过C移动到A
move(B,n,C); //多的那个盘子从B到C
Hanoi(n-2,A,B,C); //将n-2个盘子从A通过B移动到C------>又是一次递归调用