递归

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

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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. 【案例二】如下代码:

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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.【案例三】如下图:制作如下效果:【递归加载与删除】

    

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

       

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//加载数据库中的数据
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);
    }
}           

  

【递归删除】代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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));
 
}               

  

posted @   Bronc_Li  阅读(186)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示