1. 【案例一】以下代碼:node
class Program { private static int index= 0; static void Main(string[] args) { M1(); Console.ReadLine(); } private static void M1() { Console.WriteLine("A"); if (index<3) { index++; M1(); } Console.WriteLine("B"); } }
最終結果是:A A A A B B B B sql
總結:當每次調用其它方法仍是本身,都會從新分配一個內存空間,執行完成以後,向上執行,一直到調用者【Main()】方法執行完成以後。數據庫
2. 【案例二】以下代碼:ui
static void Main(string[] args) { M1(0); Console.ReadLine(); } ==================================================================================================================== private static void M1(inti) { Console.WriteLine("A"+i); i++; if (i<3) { M1(i); } Console.WriteLine("B"+i); }
結果是:spa
A0 A1 A2 B3 B2 B1blog
分析圖以下:遞歸
3.【案例三】以下圖:製做以下效果:【遞歸加載與刪除】內存
【加載數據庫中的數據】代碼以下:string
//加載數據庫中的數據 private void button1_Click(objectsender, EventArgse) { int pid=0; //1. 讀取TblArea中的數據 LoadAreaInfo(pid,treeView1.Nodes); } //加載數據 private void LoadAreaInfo(intpid, TreeNodeCollection treeNodeCollection) { //1. 先執行查詢,查詢全部的AreaPid等於Pid的 string sql="select AreaId,AreaName from TblArea where AreaPid=@pid"; DataTable dt=SqlHelper.ExecuteDataTable(sql, CommandType.Text,new SqlParameter("@pid", pid)); //2. 把dt中的數據綁定到treeNodeCollection上 foreach (DataRow itemDr in dt.Rows) { TreeNode tnode=treeNodeCollection.Add(itemDr[1].ToString()); tnode.Tag=itemDr[0]; //讀取河北下面的全部子城市,而後將這些數據綁定到tnode節點下 LoadAreaInfo((int)itemDr[0],tnode.Nodes); } }
【遞歸刪除】代碼以下:it
private void button2_Click(objectsender, EventArgse) { //1. 獲取當前選中節點 TreeNodenode=treeView1.SelectedNode; if (node!=null) { //2. 根據當前選中節點獲取AreaId intareaId=Convert.ToInt32(node.Tag); //===========執行遞歸刪除============== DeleteNodeDiGui(areaId); //3. 執行刪除 //把記錄從數據庫中刪除 //普通的刪除,只刪除選中的那一條數據 //DeleteNode(areaId); //從界面上把該節點也刪除 node.Remove(); } else { MessageBox.Show("請選中節點!"); } } ======================================================================================================================================================= privatevoidDeleteNodeDiGui(intareaId) { //1. 先把areaId做爲父Id,查詢全部的子元素 stringsql="select AreaId from TblArea where AreaPid=@pid "; DataTabledt=SqlHelper.ExecuteDataTable(sql, CommandType.Text, newSqlParameter("@pid", areaId)); //遍歷查到的全部子元素集合dt,對於每個查詢到的子元素繼續指向遍歷與刪除操做。 foreach (DataRowdrindt.Rows) { DeleteNodeDiGui((int)dr[0]); } //2. 將當前的areaId這條記錄刪除 DeleteNode(areaId); } ======================================================================================================================================================= //刪除數據庫中的數據 privatevoidDeleteNode(intareaId) { stringsql="delete from TblArea where areaId=@aid"; SqlHelper.ExcuteNonQuery(sql, CommandType.Text, newSqlParameter("@aid", areaId)); }