递归算法的简单整理

递归:


一个算法调用自己来完成它的部分工作,在解决某些问题时,一个算法需要调用自身。如果一个算法直接调用自己或间接地调用自己,就称这个算法是递归的(Recursive)。根据调用方式的不同,它分为直接递归(Direct Recursion)和间接递归(Indirect Recursion)。
比如,在收看电视节目时,如果演播室中也有一台电视机播放的是与当前相同的节目,观众就会发现屏幕里的电视套有一层层的电视画面。这种现象类似于直接递归。
如果把两面镜子面对面摆放,便可从任意一面镜子里看到两面镜子无数个影像,这类似于间接递归。
一个递归算法必须有两个部分:初始部分(Base Case)和递归部分(Recursion Case)。初始部分只处理可以直接解决而不需要再次递归调用的简单输入。递归部分包含对算法的一次或多次递归调用,每一次的调用参数都在某种程度上比原始调用参数更接近初始情况。
函数的递归调用可以理解为:通过一系列的自身调用,达到某一终止条件后,再按照调用路线逐步返回。递归是程序设计中强有力的工具,有很多数学函数是以递归来定义的。

 

例如,最近项目中用到的一个无限级分类:

 

1 /// <summary>
2 /// 获取分类数据
3 /// </summary>
4 /// <param name="parentId">父级节点ID</param>
5 /// <param name="depath">递归深度</param>
6   private void GetCategories(int parentId, int depath)
7 {
8 string prefix = string.Empty;
9 for (int i = 0; i < depath; i++)
10 {
11 prefix += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
12 }
13 depath++;
14 categories = new BLL.lookup_sort().GetList("topid=" + parentId).Tables[0];
15 foreach (DataRow c in categories.Rows)
16 {
17 str.Append("<tr align='center'>");
18
19 str.AppendFormat("<td>&nbsp;&nbsp;{0}</td>", c["sortid"]);
21 str.AppendFormat("<td>&nbsp;&nbsp;{0}</td>", c["topid"]);
22 str.Append("</tr>");
25 this.GetCategories(Convert.ToInt32(c["sortid"]), depath);
26 }
27 }

 

 

 

posted @ 2010-10-15 03:33  慧实  阅读(1202)  评论(0)    收藏  举报