汉诺塔(python)


有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆环,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:

  1. 每次只能移动一个圆盘;
  2. 大盘不能叠在小盘上面。

这道题的解题步骤就三个:

  1. A(source)杆中前n - 1个盘移到B(auxiliary)杆;
  2. A(source)杆最后一个盘移到C(destination)杆;
  3. 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);)

  1. Hanoi(n - 1,  SourcePole, DestinationPole, AuxiliaryPole);
  2. printf("将盘%d,从%c柱------>%c柱\n", n ,SourcePole, DestinationPole);
  3. Hanoi(n - 1,  AuxiliaryPole, SourcePole, DestinationPole);

(因为输出对象是SourcePoleDestinationPole,因此我们要将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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM