漢諾塔問題深度剖析(python實現)

當咱們學習一門編程語言的時候,都會遇到遞歸函數這個問題。而學習遞歸的一個經典案例就是漢諾塔問題。經過這篇文章,觀察移動三個盤子和四個盤子的詳細過程,您不只能夠深入的瞭解遞歸,也更加熟悉了漢諾塔的遊戲的玩法。html

更好的閱讀體驗可訪問 這裏python

規則

有a、b、c三個柱子,a從上到下,從小到大有n個盤子。要求把a上全部盤子移動到c,一次只能移動一個盤子,且大盤子不能放小盤子上。編程

方法

  1. 當a上有一個盤子時,直接把該盤子移動到c。
  2. 當a上有n個盤子時(n > 1):編程語言

    先把a上n-1個盤子移動到b,
    再把a上最後一個盤子移動到c,
    再把b上全部盤子移動到c。函數

代碼實現

def mov(n,a,b,c):
    if n == 1:
        # 若是a上只有一個盤子,直接把a移動到c
        print(a,'-->',c)
    else:
        # 先把a上的n-1個盤子移動到b
        mov(n-1,a,c,b)
        # 再把a上最後一個盤子移動到c
        mov(1,a,b,c)
        # 最後把b上全部盤子(n-1個)移動到c
        mov(n-1,b,a,c)

num = abs(int(input('一共有幾個盤子:')))
print('\n移動步驟爲:')
mov(num,'A','B','C')

3個盤子的實例

  1. 先把a上的2個移動到b學習

    先把a上的1個移動到c
    再把a上最後1個移動到b
    再把c上僅有的一個移動到bcode

  2. 再把a上最後一個移動到c
  3. 再把b上的兩個移動到chtm

    先把b上的一個移動到a
    再把b上最後一個移動到c
    再把a上僅有的一個移動到cblog

也就是:遞歸

A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C

4個盤子的實例

  1. 先把a上的三個移動到b(套用上面三個盤子的狀況,只不過以前是移動到c,如今是b)

    先把a上的2個移動到c

    先把a上的1個移動到b
    再把a上最後1個移動到c
    再把b上僅有的一個移動到c

    再把a上最後一個移動到b

    再把c上的兩個移動到b

    先把c上的一個移動到a
    再把c上最後一個移動到b
    再把a上僅有的一個移動到b

  2. 再把a上最後一個移動到c
  3. 再把b上的3個移動到c(仍是第一步的思路,只是換了個柱子)

    先把b上的2個移動到a

    先把b上的1個移動到c
    再把b上最後1個移動到a
    再把c上僅有的一個移動到a

    再把b上最後一個移動到c

    再把a上的兩個移動到c

    先把a上的一個移動到b
    再把a上最後一個移動到c
    再把b上僅有的一個移動到c

    也就是:

    A --> B
    A --> C
    B --> C
    A --> B
    C --> A
    C --> B
    A --> B
    A --> C
    B --> C
    B --> A
    C --> A
    B --> C
    A --> B
    A --> C
    B --> C

這樣就清晰的看出移動的各個步驟。

總結

再反過來分析一下,當移動一個盤子的時候只需一步就能完成,對應於代碼中的

if n == 1:
        # 若是a上只有一個盤子,直接把a移動到c
        print(a,'-->',c)

當移動兩個盤子的時候,得須要三步才能完成。例如:把a上的兩個盤子移動到c

  1. 先把a上的1個移動到b
  2. 再把a上最後1個移動到c
  3. 再把b上僅有的一個移動到c

當移動三個盤子的時候,就能夠分解成先移動兩個盤子,再移動一個盤子。
當移動四個盤子的時候,就能夠分解爲先移動三個盤子,再移動一個盤子。依次類推。。

可見當移動兩個或兩個以上個數盤子的時候,都只須要三步就能夠完成。其中每一步又能夠分解爲三步,直到只剩下一個盤子的狀況。對應於代碼中的

else:
        # 先把a上的n-1個盤子移動到b
        mov(n-1,a,c,b)
        # 再把a上最後一個盤子移動到c
        mov(1,a,b,c)
        # 最後把b上全部盤子(n-1個)移動到c
        mov(n-1,b,a,c)

因此,漢諾塔問題,你瞭解了嗎?

參考:python下實現漢諾塔

相關文章
相關標籤/搜索