最近在複習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
("盤 從柱-->柱"
.format
(num,a,c)
)# 列印移動情況
else
: hanoi(num-
1,a,c,b)
#一般情況,迭代到他上面的塊,注意實參的位置變化
print
("盤 從柱-->柱"
.format
(num,a,c)
)# 列印移動情況
hanoi(num-
1,b,a,c)
#處理回溯,開始考慮倒數第二塊,要將倒數第二塊從b移動到c
n=int
(input
("請輸入漢諾塔的塊數:"))
hanoi(n,
'a',
'b',
'c')
記錄一下,還要接著複習備考,就先不深入**了
思維難免有疏漏,幼稚之處,所以大佬們有什麼意見一定要提出來,我們一起討論一起進步!
2021.8.31更
最近複習資料結構,在樹、二叉樹的遍歷演算法這裡折騰了好久,對遞迴演算法又有了一些新的小感悟,趕緊記錄下。
一種遞迴是:將複雜問題一層一層分解到乙個已知的簡單問題,最後再通過函式的返回值一層一層疊加回去。
還有一種不需要回溯,用一種替代的方法,比方二叉樹的遍歷,從根節點開始,每次遍歷都把子樹看作是乙個結點。
阿西吧,我發現我好難把自己的想法用語言描述出來,,還是理解不夠透徹。。。
一點小感悟
今天去了華為的機試,說實話,題目不是很難,但是自己並沒有發揮的很好,只寫出來一題半,第一題非常簡單 兩個兩位數a,b,輸出乙個四位數,將a的十位和個位放到c的十位和百位上,b的十位和個位放到c的個位和千位上,直接轉化為字串拼接一下就行。第二題有點難度 給出1,3,9,27,81,這幾個數,輸入1 1...
一點小感悟
最近看題的時間多了,感覺回到了大一學c語言的時候,那時不會c,只能用筆算,只能自己想,但是數又很大完全用筆算 是不可能的,只能找到數中的規律,找到公式的遞推式才能解決,後來有了dp的概念,那時就更加頭疼,概念更加的抽象 不再是簡單的數學公式,變成了有意義的生活問題,這中間必須有乙個裝換,從生活問題到...
對遞迴函式的一點小理解
對於遞迴函式,大家都很熟悉了,對於解析一些複雜資料結構方面,能夠使 非常簡潔,明了。從我的理解來說,遞迴函式一般效率比較低,而且自身特點導致的限制也不少 1.效率低 乙個非常簡單的例子數數吧,從1數到1m。對於迴圈實現的 遞迴實現 對於迴圈實現,函式相當於 對於遞迴實現,相當於 對於第一種實現,不需...