浪漫骑士必胜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  145 随笔 :: 2 文章 :: 574 评论 :: 33万 阅读

递归

先来看下treeview的简单应用:

                       

一、nodes

 

二、往节点里面添加内容

下面再给大家复习下递归

什么叫递归呢?“和尚讲故事”,就是方法自己调自己,这就是递归。

 

三、方法自己调自己

我们先调下T1方法,让大家看个东西:

 

四、让大家看的东西

 

五、调用堆栈

    用堆栈来监视一下:

一开始调了main方法

再调T1方法

再调T2方法

注意一下顺序,类似于栈结构,先进来在最下面,后进来在最上面。

刚T2方法执行完毕,T2方法没了。

调完之后,从栈里面出来了。

 

再看下我调Say方法。

一开始还是调的main方法,

一直在调Say方法,这个栈越来愈大,直到系统报错。

 

六、溢出,系统报错

  递归里面注意的地方:一定要有终止条件。

  接下来我们看两个例子:

 

七、这个方法的执行结果是什么呢?

如果代码中加上:index++; 又是什么答案呢?

不让用VS测试的时候,自己可以在纸上用纸和笔划一下。

有一些个公司喜欢用这种装逼的题目当面试题的。

答案是4a4b,为什么是这样呢?

我们画图进行分析:

 

八、例一分析图示

对于初学者来讲,这幅图可能还是比较的抽象,所以,建议调试一下。

 

九、例一分析图示二

 

十、例二代码

大家再想想,这段代码的输出结果。考验人类思维极限呦。

下面我们还是画个图就行演示:

 

十一、例二分析图

n在自己的作用域范围内,互不影响。

在做一个程序的时候,能用循环做的,就不要用递归来做。用递归的话,效率极其低下。

想深入研究的朋友可以看下关于:尾递归优化的问题。

在上面两个题目中递归因为栈,才能记住,执行完后面调的方法之后返回去调没有执行完的方法里面的语句。

下面我们看下递归加载和递归删除:

 

十二、TreeView控件的基本使用

点击按钮加载表中数据到TreeView上。

递归加载子节点插入代码位置:

复制代码
View Code
 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Windows.Forms;
 9 using System.Data.SqlClient;
10 
11 namespace _04数据递归加载到TreeView与递归删除
12 {
13     public partial class Form1 : Form
14     {
15         public Form1()
16         {
17             InitializeComponent();
18         }
19 
20         private void Form1_Load(object sender, EventArgs e)
21         {
22             //1.窗体运行的时候,把节点清空
23             treeView1.Nodes.Clear();
24             //3.加载父id为0的数据到treeview以及父id对应的值。
25             DataTable dt = GetDataByParentId(0);
26             LoadCity(treeView1.Nodes, dt);
27         }
28         //4.循环进行绑定
29         private void LoadCity(TreeNodeCollection treeNodeCollection, DataTable dt)
30         {
31             //遍历dt中的每一行
32             foreach (DataRow dr in dt.Rows)
33             {
34                 int id = Convert.ToInt32(dr[0]);
35                 string areaName=dr[1].ToString();
36                 //5.每增加一个节点
37                 TreeNode tnode = treeNodeCollection.Add(areaName);
38                 tnode.Tag = id;
39                 //6.根据当前节点的Id,获取该节点下的所有子节点
40                 DataTable dtSub = GetDataByParentId(id);
41                 //递归加载
42                 LoadCity(tnode.Nodes,dtSub);
43             }
44         }
45         //2.写个方法--根据父Id获取数据的,为了方便我们这里使用DataTable,当然最好还是用list集合。
46         private DataTable GetDataByParentId(int pid)
47         {
48             DataTable dt = new DataTable();
49             string sql = "Select AreaId,AreaName from TblArea where AreaPid=@pid";
50             string constr = "Data Source=HY-PC;Initial Catalog=9月27新建数据库;Integrated Security=True";
51             //SqlDataAdapter内部有两个参数--sql语句和连接字符串
52             using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr))
53             {
54                 //设置参数
55                 adapter.SelectCommand.Parameters.Add(new SqlParameter("@pid",pid));
56                 //动态填充
57                 adapter.Fill(dt);
58                 return dt;
59             }
60         }
61     }
62 }
复制代码

为什么这的递归没有死循环呢?

foreach就是它的终结条件。

紧接着我们看下递归删除:

 

十三、递归删除

  递归这块,刚接触可能会不太熟,多练几次就熟啦。

作者近期文章列表:

 

posted on   小事好  阅读(5604)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示