遞迴函式的一點小感悟

2021-10-12 17:29:22 字數 2025 閱讀 4056

最近在複習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。對於迴圈實現的 遞迴實現 對於迴圈實現,函式相當於 對於遞迴實現,相當於 對於第一種實現,不需...