递归算法,及其在树形结构中的应用

本文介绍了递归算法的应用及实现细节,通过计算阶乘的例子解释了递归出口的重要性,并展示了如何使用递归方法解析XML文件,构建树形结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>

效果图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值