漢諾塔(遞歸函數)

題目:請編寫move(n, a, b, c)函數,它接收參數n,表示3個柱子A、B、C中第1個柱子A的盤子數量,然後打印出把所有盤子從A藉助B移動到C的方法

在看到廖雪峯老師python-遞歸函數教程下面一個大佬的解釋後,覺得非常適合我這種小白,故在此記錄

  • 首先關於漢諾塔:

有三根杆子A,B,C。A杆上有 N 個 (N>1) 穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至 C 杆:

  1. 每次只能移動一個圓盤;
  2. 大盤不能疊在小盤上面

如圖,N=3

  • 其次附上大佬代碼:
# -*- coding: utf-8 -*-
def hanoi(n, a, b, c):

    # 當n爲1時 (遞歸基礎)
    if n == 1:
        print(a, '-->', c) # 將A柱最底層的圓盤移動到C柱

    # 當n大於1時
    else:
        hanoi(n-1, a, c, b) # 藉助C柱,將n-1個圓盤從A柱移動到B柱
        print(a, '-->', c) # 將A柱最底層的圓盤移動到C柱
        hanoi(n-1, b, a, c) # 藉助A柱,將n-1個圓盤從B柱移動到C柱

#調用hanoi函數,這裏設置了n爲5的情況
hanoi(10, 'a', 'b', 'c')
  • 最後步驟解釋:
  1. n=1,即僅A柱上有一個圓盤時: 只需將A柱上圓盤移到C柱上即可,用下述語句表示該過程
    # n == 1
    print(a, '-->', c) 
    這也是本題的遞歸基礎
  2. n=2,此時A柱上從上到下有一小一大兩個圓盤,我們需要做的是先借助C柱,將小盤移動到B柱,然後就回到了n爲1的情況了,移動的過程如下:
    # n == 2
    a -> b
    a -> c
    b -> c

     

  3. n=3,此時A柱上從上到下有小中大三個圓盤,爲了便於理解引入抽象的概念,將小盤和中盤視作一個整體,將這個整體藉助C柱,移動到B柱上,然後就又一次回到了n爲1的情況了,本次移動過程如下:
    # n == 3
    a --> c
    a --> b
    c --> b
    a --> c
    b --> a
    b --> c
    a --> c

     

  4. 以此類推,總能將A柱最底層的圓盤上面的n-1個圓盤抽象爲一個整體,然後藉助C柱將其轉移到B柱上,然後就迴歸到了n=1的情況了,這時只需要和之前一樣,將A柱上的一個圓盤移動到C柱上即可;然後,對於此時在B柱上的n-1個圓盤,又可以將最底層的圓盤上面的n-2個圓盤抽象爲一個整體,藉助C柱將其移動到A柱,然後將最底層的圓盤從B柱移動的C柱上,此時,那n-2個圓盤又可以繼續如上操作;順着這個思路,可以發現,總有辦法將初始柱上的n-1個圓盤,藉助目的柱而移動到中間柱上,進而就回到了最簡單的n爲1的情況。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章