递归

1. 【案例一】如下代码:

   

 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

    总结:当每次调用其它方法还是自己,都会重新分配一个内存空间,执行完成之后,向上执行,一直到调用者【Main()】方法执行完成之后。

2. 【案例二】如下代码:

   

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

  

    结果是:

    A0 A1 A2 B3 B2 B1

    分析图如下:

    

3.【案例三】如下图:制作如下效果:【递归加载与删除】

    

【加载数据库中的数据】代码如下:

       

 //加载数据库中的数据
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);
    }
}            

  

【递归删除】代码如下:

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

}                

  

原文地址:https://www.cnblogs.com/taidou/p/4720845.html