有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆环,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
- 每次只能移动一个圆盘;
- 大盘不能叠在小盘上面。
这道题的解题步骤就三个:
- 将A(source)杆中前n - 1个盘移到B(auxiliary)杆;
- 将A(source)杆最后一个盘移到C(destination)杆;
- 将B(auxiliary)杆n - 1个盘移到C(destination)杆;
动态图演示(借前辈图一用)
如果这样说你还是不能理解过程,那么我们就回想一下之前的n项求和,我们将前n-1项 + 第n项。那么在这里,我们将前n-1个盘看成一个整体(盘的位置不变),将最后一个大盘看成一个整体,先将那一大坨移到B杆,再把A杆剩下的那个大盘移到C杆,然后我们再把那一大坨移到C杆。
整体过程:
a.同样的这道题我们通过解题步骤去找关系式:(整个函数的声明是void Hanoi(int n, char SourcePole, char AuxiliaryPole, char DestinationPole);)
- Hanoi(n - 1, SourcePole, DestinationPole, AuxiliaryPole);
- printf("将盘%d,从%c柱------>%c柱\n", n ,SourcePole, DestinationPole);
- Hanoi(n - 1, AuxiliaryPole, SourcePole, DestinationPole);
(因为输出对象是SourcePole到DestinationPole,因此我们要将A杆的盘转移到B杆上,就需要在递归调用函数,传入参数时,将参数换位。)
b.接着我们写出口,移动n - 1个盘,也就是1~(n -1),当n = 0时结束函数。
因此写出程序:
def HT(a,b,c,n): if n==0: return HT(a,c,b,n-1)#a->b print(a,'-->',c) HT(b,a,c,n-1)#b->c