遞迴函式的一點小感悟
阿新 • • 發佈:2020-12-24
最近在複習Python的遞迴函式部分,突然有了一些小感悟,想趕緊先記錄下來,日後再深入思考,完善這篇文章
之前寫遞迴函式的題目總是無從下手。後來我突然聯想到高中數學(好像離散數學中也說過),有一個關於遞迴證明法的介紹,對於一個命題的證明,首先我們得證明某一種特殊情況的成立,其次對於任意一般情況,我們都可以通過“迭代”慢慢趨向到這個特殊情況上,這樣這個命題便證明成功。
那和遞迴函式有什麼聯絡?我觀察到,每一個遞迴函式解法都是不斷迭代到一個特殊點去解決,然後再不斷回溯完成整個流程。也就是說,對於任意一道遞迴函式的演算法題,我們首先應該需要找到這個特殊情況
,即處於終結點我們將不再繼續迭代下去。另一個思考地方是如何讓一般情況趨向特殊情況,最後思考如何處理回溯的元素(思考倒數第二個情況比較容易)
我舉個例子:
題目很簡單:使用遞迴演算法將一個字串反轉。
首先我們思考,終結情況是什麼?
應該是最後一個字元,當遇到最後一個字元時候我們應該立馬輸出,停止繼續迭代
當遇到其他字元的時候我們應該讓他在身後字元先輸出
def reverseStr(str1,i):#這裡i的作用要注意,呼叫時候傳遞0進去,表示從字串首元素開始
#先判斷特殊情況
if i=len(str1)-1:
print(str1[i],end="")
else :#對於一般情況的處理,我們只要思考倒數第二位如何處理就好
reverseStr(str1,i+1)#為什麼要i+1,因為要趨向終結情況
print(str1[i],end="")#處理回溯,倒數第一輸出完成後,我們就要輸出倒數第二了
對於經典的漢諾塔問題
依然,我們首先找特殊情況,當某一個塊為最頂端的塊時(特殊情況),他直接移動就好(不迭代)
當一個塊不是最頂端的塊的時候(一般情況),我們就需要將他上面的塊堆移動到另一個柱子上(趨向方法)
當上面的塊堆移動完成,他就可以完成移動了 (處理回溯)
def Hanoi(num,a,b,c):#把num個方塊從a移動到c
if num==1:#特殊情況,塊在最頂端,直接移動
print("盤{0} 從{1}柱-->柱{2}".format(num,a,c)) # 列印移動情況
else:
Hanoi(num-1,a,c,b)#一般情況,迭代到他上面的塊,注意實參的位置變化
print("盤{0} 從{1}柱-->柱{2}".format(num,a,c)) # 列印移動情況
Hanoi(num-1,b,a,c)#處理回溯,開始考慮倒數第二塊,要將倒數第二塊從b移動到c
n=int(input("請輸入漢諾塔的塊數:"))
Hanoi(n,'A','B','C')
記錄一下,還要接著複習備考,就先不深入探討了
思維難免有疏漏,幼稚之處,所以大佬們有什麼意見一定要提出來,我們一起討論一起進步!