漢諾塔的定義:
1、總共更有三個柱子,在第一根柱子上,從下往上按從大到小的順序疊放着一堆盤子,即下大上小;
2、每次只能移動一個盤子,且大盤子不能放在小盤子上面,即保證每根柱子上盤子都是下大上小;
3、最終目標是把盤子從左邊第一根柱子,移動到右邊第三個柱子。
利用遞歸函數解決漢諾塔移動:
假定有n個盤子,從左到右依次有a,b,c三個柱子。剛開始n個盤子都在a柱子上。
若n=1,直接把盤子從a移動到c;
若n>1,則:
第一步:把a柱子上除最下面的那個盤子外的n-1個盤子,全部移動到b柱子上;
第二步:把a柱子上最下面的那個盤子,移動到c柱子上;
第三步:把b柱子上的n-1個盤子,全部移動到c柱子上;
代碼如下:
def move(n,a,b,c): if n==1: print('move',a,'-->','c') #圓盤個數為1時,從a移動到c即可完成,用來終止遞歸 else: move(n-1,a,c,b) #把除了a柱子最下的一個圓盤以外的其他圓盤,都移動到b柱子 move(1,a,b,c) #把a柱子最下的圓盤,移動到c柱子 move(n-1,b,a,c) #把b柱子上的n-1個盤子,全部移動到c柱子
假定n=3,該程序執行過程如下:
move(3,a,b,c)
move(3,a,b,c) move(2,a,c,b) #a柱上面兩個盤子,移動到b柱子 move(1,a,b,c) #a柱最上面一個盤,移動到b柱。對函數move(2,a,c,b),其‘a’柱為a,‘b’柱為 c。因n=1,執行print語句,a-->c move(1,a,c,b) #a柱子最下面盤子移動到c柱子。對於move(2,a,c,b)函數,其‘c’柱子為 b。因n=1,執行print語句,a-->b move(1,c,a,b) #b柱子上的一個盤子移動到c柱子。對於move(2,a,c,b)函數,其‘b’柱子為 c,'c'柱為b。因n=1,執行print語句,c-->b move(1,a,b,c) #a柱最下面盤子,移動到c柱子。因n=1,執行print語句,a-->c move(2,b,a,c) #b柱上的兩個盤,移動到c柱 move(1,b,c,a) #a柱最上面一個盤,移動到b柱。對函數move(2,b,a,c),其‘a’柱為b,‘b’柱為a。因n=1,執行print語句,b-->a move(1,b,a,c) #a柱最下面的盤移動到c柱。對move(2,b,a,c)函數,其‘a’柱為b,‘c’柱為c。因n=1,執行print語句,b-->c move(1,a,b,c) #b柱上的一個盤移動到c柱。對move(2,b,a,c)函數,其‘b’柱為a,‘c’柱為c。因n=1,執行print語句,a-->c #程序依次執行,顯示的順序為: move a-->c move a-->b move c-->b move a-->c move b-->a move b-->c move a-->c