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>
效果圖: