python入門系列-3-用遞歸函數實現漢諾塔解答步驟

1.遞歸函數是什麼

關於這個問題CSDN和知乎上有許多解答,意思就是函數調用函數本身,但是這樣就太濃縮了,就沒有多少味道。
今天學了遞歸函數,我的理解就是在運行程序時,調用遞歸函數,把大問題切成兩部分,一部分包含一個情況,另一部分包含其他的情況;然後遞歸函數一直就這樣再調用函數本身,直至到達邊界條件。

1.1 兩點要求

1.遞推關係
就是函數與其調用函數本身之間的關係;在下面用例子來解釋

2.終止條件**
使遞推終止的條件,類似於循環的邊界條件

1.2 怎樣理解呢

原理上來理解

來源於

實例理解
在這裏插入圖片描述
來源於leetcode在知乎上關於“對於遞歸有沒有什麼好的理解方法”的回答。我就是看這個圖理解的。

2.程序實現

2.1原理

第一步,有n個盤和三個柱子(f:最開始放盤的柱子,s:空閒的柱子,t:目標柱子);將最底層上面的n-1個盤先搬到s柱(遞歸來實現)

第二步,將最底層的大盤搬到t柱(遞歸邊界條件)

第三步,將s柱上的n-1個盤搬到t柱(遞歸來實現)

2.2程序實現

def hannuo(n,f,t,s):

    if n==1:                  ##終止條件
        print(f,'to',t)
    else:
        hannuo(n-1,f,s,t)        ##遞推關係
        hannuo(1,f,t,s)
        hannuo(n-1,s,t,f)
        
##以4個盤的爲例
hannuo(4,'center','left','right')    

在這裏插入圖片描述
這樣就基本實現了。

2.3 進一步優化

但是作爲一個有點完美主義的我來說,似乎還缺點什麼。我們也許可以打印出第幾步……

但是不能直接在函數內部設置一個計數器,那樣會出現不能計數的情況:
在這裏插入圖片描述
原因是局部變量,每次調用時都被賦初值。

因此我們需要一個全局變量

##漢諾塔程序
count=0
def hannuo(n,f,t,s):
    global count
    if n==1:
        count=count+1
        print('the',count,'step: ',f,'to',t)
    else:
        hannuo(n-1,f,s,t)
        hannuo(1,f,t,s)
        hannuo(n-1,s,t,f)
        

運行結果如下
在這裏插入圖片描述
到這裏就基本上完成了。

謝謝大家閱讀,如有錯誤,歡迎指教!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章