1. 程式人生 > >具有返回值的遞歸

具有返回值的遞歸

tro color 二叉 root lin bug 很難 多次 保存

一個函數只能有一個返回值,具有返回值的遞歸函數若平行的多次調用自身,那麽將會產生多個返回值,這是一個bug。所以在具有樹形多分枝結構的遞歸中,一般使用void作為返回值類型,形參在每條路徑中作為值傳遞,在出口處對這些值進行保存或比較輸出。例如求樹高 的兩種寫法:

 1 struct Node{
 2     int val;
 3     Node* child;
 4     Node* sibling;
 5     Node(){
 6         child=NULL;
 7         sibling=NULL;
 8     }
 9 }; 
10 int height(Node *root){
11 if(root){ 12 int maxh=0; 13 for(Node *p=root;p;p=p->sibling){ 14 int tmp=height(p->child); 15 if(maxh<tmp){ 16 maxh=tmp; 17 } 18 } 19 return maxh+1; 20 } 21 return 0; 22 }

 1 int maxh=0;
 2 void
height(Node *root,int h){ 3 if(root){ 4 for(Node* p=root;p;p=p->sibling){ 5 height(p->child,h+1); 6 } 7 }else{ 8 if(maxh<h){ 9 maxh=h; 10 } 11 } 12 }

這是因為樹高要求每條路徑的最深,再進行比較,是到最深處才能確定的。也是唯一的解。而其除了這些有唯一解的遞歸問題,比如n皇後問題所代表的一類多解問題,或者是多分枝層次問題,例如遞歸建立二叉樹,就很難使用帶有返回值的遞歸求解。帶有返回值的遞歸,由淺入深,在最深處達到出口進行計算後能逐層返回淺層。

一個關鍵性的點,就是具象的多分枝遞歸是一個怎樣的過程,前面的文章中提到過多分枝的遞歸問題生成樹形結構。故具體的可以參考二叉樹的三種遞歸遍歷和圖論中的DFS,遞歸是以一條路走到黑,走不動再返回分岔口再選擇另一條路,最終遍歷多分枝的所有路徑的方法,類似我們走迷宮的暴力解法。每條路徑不能直接進行傳值等交互操作但是,但我們可以對路徑進行選擇,選擇符合我們條件的路徑的結果。

具有返回值的遞歸