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)
運行結果如下
到這裏就基本上完成了。
謝謝大家閱讀,如有錯誤,歡迎指教!