漢諾塔(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