1. 程式人生 > 其它 >遞迴函式的一點小感悟

遞迴函式的一點小感悟

技術標籤:演算法總結+思考演算法python遞迴演算法

最近在複習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')

記錄一下,還要接著複習備考,就先不深入探討了
思維難免有疏漏,幼稚之處,所以大佬們有什麼意見一定要提出來,我們一起討論一起進步!
在這裡插入圖片描述