你真的懂遞迴 或者 寫的好遞迴嗎

2021-09-28 11:40:43 字數 1082 閱讀 5075

一、什麼是遞迴?

1.遞迴是一種非常高效、簡潔的編碼技巧,一種應用非常廣泛的演算法,比如dfs深度優先搜尋、前中後序二叉樹遍歷等都是使用遞迴。

2.方法或函式呼叫自身的方式稱為遞迴呼叫,呼叫稱為遞,返回稱為歸。

3.基本上,所有的遞迴問題都可以用遞推公式來表示,比如

f(n) = f(n-1) + 1;

f(n) = f(n-1) + f(n-2);

f(n)=n*f(n-1);

二、為什麼使用遞迴?遞迴的優缺點?

1.優點:**的表達力很強,寫起來簡潔。

2.缺點:空間複雜度高、有堆疊溢位風險、存在重複計算、過多的函式呼叫會耗時較多等問題。

三、什麼樣的問題可以用遞迴解決呢?

乙個問題只要同時滿足以下3個條件,就可以用遞迴來解決:

1.問題的解可以分解為幾個子問題的解。何為子問題?就是資料規模更小的問題。

2.問題與子問題,除了資料規模不同,求解思路完全一樣

3.存在遞迴終止條件

四、如何實現遞迴?

1.遞迴**編寫

寫遞迴**的關鍵就是找到如何將大問題分解為小問題的規律,並且基於此寫出遞推公式,然後再推敲終止條件,最後將遞推公式和終止條件翻譯成**。

2.遞迴**理解

對於遞迴**,若試圖想清楚整個遞和歸的過程,實際上是進入了乙個思維誤區。

那該如何理解遞迴**呢?如果乙個問題a可以分解為若干個子問題b、c、d,你可以假設子問題b、c、d已經解決。而且,你只需要思考問題a與子問題b、c、d兩層之間的關係即可,不需要一層層往下思考子問題與子子問題,子子問題與子子子問題之間的關係。遮蔽掉遞迴細節,這樣子理解起來就簡單多了。

因此,理解遞迴**,就把它抽象成乙個遞推公式,不用想一層層的呼叫關係,不要試圖用人腦去分解遞迴的每個步驟。

五、遞迴常見問題及解決方案

1.警惕堆疊溢位:可以宣告乙個全域性變數來控制遞迴的深度,從而避免堆疊溢位。

2.警惕重複計算:通過某種資料結構來儲存已經求解過的值,從而避免重複計算。

六、如何將遞迴改寫為非遞迴**?

籠統的講,所有的遞迴**都可以改寫為迭代迴圈的非遞迴寫法。如何做?抽象出遞推公式、初始值和邊界條件,然後用迭代迴圈實現。

C語言 蠻好的遞迴題目

任務 猴子第一天摘下n個桃子,當時就吃了一半,還不過癮,就又多吃了乙個。第二天又將剩下的桃子吃掉一半,又多吃了乙個。以後每天都吃前一天剩下的一半零乙個。到第10天在想吃的時候就剩乙個桃子了,問第一天共摘下來多少個桃子?並反向列印每天所剩桃子數。include intgetpeachnumber in...

你真的懂資料庫的索引嗎(下篇)

mysql對索引的選擇 給字串加索引 select id from t where a 1 對於上述這條select語句,首先從b 樹的樹根開始,按層搜尋到葉子節點,然後再根據二分法來定位記錄。只能說兩者的查詢效率差別不大,innodb的資料是按照頁為單位來讀寫的,當讀到一條記錄的時候,並不是把這個...

你寫的Try Catch真的有必要麼?

很多人喜歡用try.catch把每乙個方法都包裹起來,可是真的有必要麼?為什麼要這樣做?我估計是大家被bug嚇怕了,生怕生產環境出現各種莫名其妙的錯誤,比如最經典的nullreferenceexception,可問題是你用try.catch包裹起來後錯誤是不會爆出來了,但是執行結果是你想要的麼?恐怕...