有三根桿子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