1.递归算法一定要注意必须存在递归出口
示例如下:求N! 我们从例子中归纳如8!=7!*8,归结方法为 Multiply(n)=Multiply(n-1)*n
代码如下:
namespace Test
{
class Program
{
static void Main(string[] args)
{
//测试3的阶乘结果
Console.WriteLine(Multiply(3)); //经过测试结果为6,正确。
Console.Read();
}
//阶乘的方法
public static int Multiply(int n)
{
if (n<0)
{
throw new Exception("阶乘数不能小于0");
}
else if (n == 0)
{
return 0;
}
//n=1是递归出口,因为在该代码块中没再有调用该方法,而是给出了一个数
else if (n == 1)
{
return 1;
}
else
{
return Multiply(n-1) * n ;
}
}
}
}
另外,在树形结构中最常用的是递归算法。
这里就举例,树形结构的典型代表是XML和TreeView
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace Test
{
public partial class Form1 : Form
{
XmlDocument xml;
public Form1()
{
//创建XmlDocument 实例
xml = new XmlDocument();
xml.Load("xmltest.xml");
InitializeComponent();
}
//窗体加载事件
private void Form1_Load(object sender, EventArgs e)
{ //添加treeView的根节点
this.treeView1.Nodes.Add(new TreeNode(xml.DocumentElement.Attributes["Name"].Value));
//调用TreeNode添加方法
LoadXML(this.treeView1.Nodes[0],xml.DocumentElement);
}
//添加TreeNode的方法
private void LoadXML(TreeNode treeNode, XmlNode xmlNode)
{
//将没给xmlNode的子节点,添加到treeNode的子节点集合中,此处暗含递归出口---如果该节点没有子节点,将直接退出!
foreach (XmlNode node in xmlNode.ChildNodes)
{
TreeNode subTreeNode= treeNode.Nodes.Add(node.Attributes["Name"].Value);
LoadXML(subTreeNode, node);
}
}
}
}
XML文件:
<?xml version="1.0" encoding="utf-8" ?>
<!--根节点 -->
<Company Name="华为">
<Department Name="财务部">
<Team Name="1号小组">
<Employee Name="张三"/>
<Employee Name="李四"/>
<Employee Name="王五"/>
<Employee Name="哈哈哈"/>
</Team>
<Team Name="2号小组">
<Employee Name="1"/>
<Employee Name="2"/>
<Employee Name="3"/>
<Employee Name="4"/>
</Team>
<Team Name="3号小组">
<Employee Name="a"/>
<Employee Name="b"/>
<Employee Name="c"/>
<Employee Name="d"/>
</Team>
</Department>
<Department Name="行政部"/>
<Department Name="研发部">
<Team Name="财务1">
<Employee Name="CFO"/>
</Team>
</Department>
<Department Name="生产部"></Department>
</Company>
效果图: