遞迴是演算法中的一種很重要思想。好的遞迴程式邏輯清楚,**簡潔,有時候時間上也非常高效;此外鍊錶、二叉樹等結構用遞迴演算法一般都有鮮明優勢。
往往遞迴問題口頭說起來感覺十分清晰順暢;而用**實現起來確總感覺層巒疊嶂,不知從何下手,思路也越來越混亂不堪。
最近在解決一些演算法相關的小問題時候,經常需要用到遞迴,有幾點感悟。
遞迴的目標,時刻從要得到的結果\目標考慮。
當然,遞迴要把握住從本層到下一層的具體邏輯/代數關係。例如需要各層數值累加;本層的條件不足以判斷需求的結果,還需要下一層的條件等。這一般是認為相對簡單的。
**中要有明確的在每一層傳遞變數和返回結果;以使遞迴持續下去,同時能獲取下一級的結果。
遞迴的終止條件。可能是數值超過給定的範圍,可能是已經能判斷出需要的結果。
遞迴到邊界時候的寫法統一到遞迴中。到達容器邊界,也會導致遞迴終止,這就給程式終止帶來一定的複雜性。把問題想明白了就很簡單,因為在邊界上除了有強行終止,還有遞迴條件目標的終止。
1> 遞迴的每一層都可能是容器邊界,從著手寫**就應該考慮。
2> 列舉所有可能的容器邊界,判斷個邊界對應的返回結果。
3> 除容器邊界外的情況,都應當是可向下一步遞迴的。在這個情況下寫出符合目標條件的遞迴關係式。
對稱樹的判別
struct treenode
};bool issubsym(treenode* tr1,treenode* tr2)
}bool issymmetric(treenode* root)
考察對稱樹某對節點的數值是否相等還不足以判定是否為對稱樹,必須進一步判斷以其為根的子樹是否對稱。
樹只能從根節點往葉節點遍歷,遞迴是很好的辦法,可以回溯。
沒有直接用issymmetric()遞迴,因為向下一層判斷的時候樹根不一樣。
判斷兩個子樹是不是對稱的issubsym(),考慮到子樹的所有可能情況:
1> 兩子樹為空,或兩子樹都已經到了葉節點且數值相等,為對稱樹。(容器邊界)
2> 兩子樹乙個為空,另乙個不為空,非對稱樹。(容器邊界)
3> 兩子樹都不為空 >> 可以繼續遞迴,當前層的條件不能充分得到判斷結果。
4> 兩子樹樹根數值相等,向下遞迴,遞迴的時候按照對稱的規則;數值不等,非對稱樹。(傳遞變數,終止條件)
遞迴的寫法
foreach datarow dr0 in dt.rows tn1 new treenode tn1.nodes.add tn0 tn1 tn0 tn3 tn1 method tn1 treeview1.nodes.add tn1 private void method treenode tn1 ...
oracle 遞迴寫法
查詢所有 select from t address t 向下找包含自己 select from t address start with addr id connect by prior addr id addr pid 向下找不包含自己 select from t address start w...
遞迴寫法轉成迭代
乙個常見的遞迴演算法例子 斐波那契 long fib int n 1 例如求fib 10 中間值fib 3 會被求值21次。但是其實只需求一次即可,剩餘的20次求職 屬於資源的浪費。2 每一次的fib計算都導致兩次的遞迴呼叫,成指數增長形勢。需要大量的堆疊來儲存函式呼叫資訊儲存。以上例子是屬於 尾遞...