1. 程式人生 > >遞歸——漢諾塔問題(python實現)

遞歸——漢諾塔問題(python實現)

最大 大盤 其他 pytho 每次 直接 print int b-

規則

  1. 每次移動一個盤子
  2. 任何時候大盤子在下面,小盤子在上面

方法

假設共n個盤子

  • 當n=1時:
    1. 直接把A上的一個盤子移動到C上(A->C)
  • 當n=2時:
    1. 把小盤子從A放到B上(A->B)這裏開始采用參數,rsc源地址=A,dst目的地址=B
    2. 把大盤子從A放到C上( A->C)rsc=A, dst=C
    3. 把小盤子從B放到C上(B->C)rsc=B, dst=C
  • 當n=3時:
    1. 把A上的兩個盤子,通過C移動到B上去, 調用遞歸實現(A-C->B)rsc=A, trans中轉=C, dst=B
    2. 把A上剩下的一個最大盤子移動到C上(A->C)rsc=A, dst=C
    3. 把B上兩個盤子,借助於A,挪到C上去, 調用遞歸(B-A->C)rsc=B, trans=A, dst=C
  • 當n=n時:

    1. 把A上的n-1個盤子,借助於C,移動到B上去,調用遞歸(A-C->B)rsc=A, trans=C, dst=B

    2. 把A上的最大一個盤子,移動到C上(A->C)rsc=A, dst=C

    3. 把B上n-1個盤子,借助於A,移動到C上, 調用遞歸(B-A->C)rsc=B, trans=A, dst=C

每次都是先將其他圓盤移到輔助柱子上,再將最底下的移到C,然後再把原先柱子作為輔助柱子,重復

代碼實現

def move(n, a, b, c):
'''
漢諾塔的遞歸實現
n:代表幾個盤子
a:代表第一個塔,rsc
b:代表第二個塔,trans
c:代表第三個塔, dst
'''
    if n == 1:
        print(a, '=>', c)
    else:
        move(n-1, a, c, b)
        print(a, '=>', c)
        move(n-1, b, a, c)

遞歸——漢諾塔問題(python實現)