1. 程式人生 > >Hanoi Tower--漢諾塔問題

Hanoi Tower--漢諾塔問題

問題描述

  • 源於印度一個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動一個圓盤。問應該如何操作?

思想:遞迴

  • 歸納推理:設柱子的序號依次為A,B,C;圓盤的原始位置為A,目標位置是C;圓盤個數為n;
    1. n=1.則直接一步操作A---->C,steps=1
    2. n=2.則先將第1塊移到B:A-->B,再第2塊移到C:A-->C,最後:B-->C,steps=1+1+1=3
    3. n=3.則將第一塊和第二塊當成一個整體,通過上一步的操作,可以移到B,之後第三塊移到C;最後類似上一步的逆操作完成第一塊和第二塊到C的移動;steps =3+1+3=7
  • 類似以上操作,容易觀察到,整個流程其實分為三個階段完成:
    • A取出前n-1塊移至B;
    • A中的第n塊移至C;
    • B中的前n-1塊移至C;
  • 當n=4時,第一階段需要移7步,第二階段需要一步,第三階段也需要7步;因此steps=7+1+7=15
  • 很顯然,通過歸納,不難發現其中的規律。
  • 因此,總的步驟為:S(n)=2n1S(n)=2^n-1

程式碼實現

  • 具體的移動步驟用python打印出來,總步驟可直接用公式計算。
def hanoi(n, a, b, c):
    if n == 1:
        print(a, '-->', c)
    else:
#A前n-1塊移到B hanoi(n-1, a, c, b) # 第n塊移到C print(a, '-->', c) # B中前n-1塊移至C hanoi(n-1, b, a, c) if __name__=="__main__": hanoi(5, 'A', 'B', 'C')