遞歸實現及特性要點
遞歸板之上就是類似於循環,只不過是通過循環調用自己。
通過函數體來進行循環
例子:
小時候的“從前有座山山裏有座廟,廟裏有個老和尚…”
《盜夢空間》
遞歸的特點
(以盜夢空間舉例)
- 向下進入到不同夢境中;向上又回到原來一層【一定是一層一層的,具有對稱性】
- 通過聲音同步回到上一層【這種同步的關係就是用參數來進行,函數不同層之間的傳遞變量】
- 每一層的環境和周圍的人都是一份拷貝,主角登記人穿越不同層級的夢境-發生和攜帶變化【主角相當於參數,通知還會有一些全局變量】
遞歸例子
最簡單的遞歸形式
計算n!
def Factiorial(n):
if n<=1:
return 1
return n*Factorial(n-1)
遞歸代碼模板
python版
def recursion(level,param1,param2,...):
#recursion terminator(遞歸終止條件)
if level>MAX_LEVEL:
process_result
return
#process logic in current level(處理當前層邏輯)
process(level,data...)
# drill down(下探到下一層)
self.recursion(level+1,p1,...)
#reverse the current level status if needed(清理當前層)
Java版
public void recur(int level,int param){
//terminator
if(level>MAX_LEVEL){
//process result
return;
}
//process current logic
process(level,param);
//drill down
recur(level:level+1,newParam);
//restore current status
}
思維要點
- 不要人肉遞歸(最大誤區)
- 找到最近最簡的辦法,將其拆解成可重複解決的問題(重複子問題)
- 數學歸納法思維
面試題
爲什麼樹的面試題解法一般都是遞歸
- 節點定義,它的本身數據結構的定義就是用遞歸的範式完成的
- 重複性(自相似性),不僅是樹、二叉樹以及搜索二叉樹,他在定義它的數據結構和它的算法特性的時候也是有重複性和自相似性。