遞歸

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));

}                
相關文章
相關標籤/搜索