汉诺塔递归问题的分析与Python实现
背景
相傳在古印度圣廟中,有一種被稱為漢諾塔(Hanoi)的游戲。該游戲是在一塊銅板裝置上,有三根桿(編號A、B、C),在A桿自下而上、由大到小按順序放置64個金盤(如圖)。游戲的目標:把A桿上的金盤全部移到C桿上,并仍保持原有順序疊好。操作規(guī)則:每次只能移動一個盤子,并且在移動過程中三根桿上都始終保持大盤在下,小盤在上,操作過程中盤子可以置于A、B、C任一桿上。
分析
(1)當A桿上有一塊銅板時,直接將其移動到C桿上即可;
(2)當A桿上有兩塊銅板時,將較小的那塊移動到B桿上,再將較大的那塊移動到C桿上(即與(1)相同),最后再將B桿上的那塊移動到C桿上即可;
(3)當A桿上有三塊銅板時,將A桿上方的兩塊銅板看成一個整體,要想實現(xiàn)目標,需要將這個整體一起移動到B桿上(即與(2)相同),再將A桿最下方的銅板移動到C桿上,最后再將B桿上的兩塊銅板移動到C桿上;
…
以此類推,當A桿上有n塊銅板時,將A桿上方的(n-1)塊銅板看成一個整體,一起移動到B桿上,而這就是A桿上有(n-1)塊銅板的目標。
假設hanoi(n, from_, with_, to_)是一個函數(shù),表示n塊銅板從from_桿上借助于with_桿移動到to_桿上,那么該函數(shù)需要實現(xiàn):
- 將A桿上方(n-1)塊銅板借助于C桿移動到B桿,即hanoi(n-1,A,C,B),調用hanoi()函數(shù)自身;
- 將A桿上最后一塊銅板移動到C桿,直接移動即可;
- 將B桿上(n-1)塊銅板借助于A移動到C桿,即hanoi(n-1,B,A,C),調用hanoi()函數(shù)自身。
這種為了解決問題,重復地將問題分解為同類的子問題的方法就叫遞歸。
代碼實現(xiàn)
python標準庫turtle自帶漢諾塔例子(${PYTHON_HOME}/Lib/turtledemo/minimal_hanoi.py),主要遞歸代碼如下:
def hanoi(n, from_, with_, to_):if n > 0:hanoi(n-1, from_, to_, with_)to_.push(from_.pop())hanoi(n-1, with_, from_, to_)當有6層銅板時,效果如下:
總結
以上是生活随笔為你收集整理的汉诺塔递归问题的分析与Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷P1902 刺杀大使(二分答案+bf
- 下一篇: UG模具设计主要学习哪些内容?