遞迴和巢狀迴圈的區別
親,不要誤以為自己呼叫自己就等於遞迴了!
遍歷子節點
/// ///
當前節點
///關鍵字 void findchildnode(treenode tnparent, string
keystr)
}//////
展示符合條件的節點
/// ///
void
displaynode(treenode tn)
}//////
檢測當前節點
/// ///
///void checknode(treenode tn, string
keystr)
else
}//從低往高加
public
int sum23(int
param)
return
sum;
}//從高往第加
public
int sum1(int
param)
return
sum;
}public
int sum(int
param)
else
}public
long fac(int
n)
else
return
value;}}
}}其實,我也不知道第一種情況算不算嚴格意義上滴遞迴滴呀;
下面的方法是另外的一種方式來實現滴呀;
void findchildnode2(treenode tnparetn, string後面,我對遞迴由進一步的研究了,然後發現,我的結論可能是錯的;!!!keystr)
else}}
我們來看兩種遞迴的執**況;
沒有返回值,僅僅是又我們的臨界值;
///它的執行過程,可以這麼理解:///相當於乙個進棧和出棧的過程;當達到臨界值之後,就會回到開始點;
///進行出棧;
/// ///
public
static
void callself(int
n)
}
或者,你可以這麼理解它;
我擦,流程有夠醜的,不過相當直觀了,如果還不太清楚,你可以自己除錯一哈,跟著走一遍,就會有較為深刻的理解了;
這裡再貼出乙個fibo數的實現過程;
然後,我們來看乙個,有返回值的遞迴;
///對這裡個理解,我們就可以使用,可以用第乙個圖來進行解釋,因為,這裡有乙個關鍵點;就是它會儲存,當時執行時的一些變數資訊;當回到遞迴的開始點時,又你能用到但是的些變數值;(這個是非常重要的點;)///call themself with return
/// ///
///public
static
int callselfwithreturn(int
n)
console.writeline(n);
return callselfwithreturn(--n);//
又重新回到這個點;
}
我們再來看他隱身出的一些列的問題:
//其實,在開發中,我們常常遇到這樣的場景;具有父子節點的集合(類似tree的結構);這個時候,我們需要把它組裝成符合tree nodes(能體現出層級關係的nodes關係圖);總的來說,它是利用了大頂堆的特性;
//乙個完整的堆定二叉樹,堆定都是乙個最大的資料;
//每次從堆定取出乙個數,然後此時堆,新的堆序列又亂了,然後有開始進行重新調整;然後
//堆疊,它每次回記得呼叫後的,當時的資料,以便在回到這個點的時候,繼續進行;
//而同樣的方法,我們可以使用for迴圈來實現;
public
static
void foreachimple(int
n)
}//////
其實,我們的遞迴方式,更像這種方式來執行的;
/// ///
public
static
void foreachimple2(int
n) }}
}//所以我們再遍歷,node的時候,常常會寫出這樣的**;
//我想看他是如何如構造一顆樹滴呀;
public
static listcreatenodes()
,newnode() }};
node node1 = new
node()
;node nodetop = new
node()
};list
list = new list();
list.add(nodetop);
return
list;
}public
static
void
iteori()
//}//}
///有節點,我們才進入我們的子節點中去進行遍歷,這個相當於我們的左節點遍歷;
//然後,我們就就有了下面的遍歷方式:遍歷的深度,無法動態的擴充套件
foreach (var topnode in
list)}}
}}//那麼還有沒有更好的方式去進行遍歷呢;
}
//就這樣簡單的試煉我們 節點的遍歷;(其實,這個就是我們的前序遍歷的實現)
public
static
void nodeitmeor(listnodes)}}
下面我們看具體的例項;
//////實際的測試方法;
///相當管用滴呀;
/// public
static
void
test()
,new node() ,
new node() ,
new node() ,
new node() ,
new node() ,
new node()
};var pnodes = listnodes.where(o=>o.pid==0
).tolist();
var childrends = listnodes.where(o=>o.pid!=0
).tolist();
foreach (var topnode in
pnodes)
}//////
/
/// ///
///public
static
void findchild(node parentnode, listnodes)}}
迴圈和遞迴的區別
對於遞迴和迴圈相比較 遞迴的 比較簡潔,容易讓別人理解,也容易讓自己理解,但是占用的空間非常大,有的時候在實現功能時,把所能用的空間全都用掉,可能還不夠,此時就會崩潰,而不進行任何操作,計算機不一定願意去實現,而且迴圈和遞迴實現同一功能時所用時間基本是沒有什麼差別的.解決問題方法的效率跟空間的利用效...
遞迴和迴圈的區別
斐波那契數列 迴圈演算法 總結 簡潔 清晰,並且容易驗證正確性。如果你真的理解了演算法的話,否則你更暈 它的執行需要較多次數的函式呼叫,如果呼叫層數比較深,需要增加額外的堆疊處理,比如引數傳遞需要壓棧等操作,會對執行效率有一定影響。但是,對於某些問題,如果不使用遞迴,那將是極端難看的 明確遞迴終止條...
死迴圈和巢狀迴圈
死迴圈 也就是迴圈中的條件永遠為true,死迴圈的是永不結束的迴圈。例如 while true 在後期的開發中,會出現使用死迴圈的場景,例如 我們需要讀取使用者輸入的輸入,但是使用者輸入多少資料我們並不清楚,也只能使用死迴圈,當使用者不想輸入資料了,就可以結束迴圈了,如何去結束乙個死迴圈呢,就需要使...