用遞歸函數解決漢諾塔移動問題。


漢諾塔的定義:

  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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM