当前位置: 首页 > article >正文

C# 递归算法使用简介_常用整理

一、递归简介

递归算法是一种直接或者间接调用自身函数或者方法的算法。

递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。

递归本质是循环,循环推理。

递归是一种数学上分而自治的思想。

A、将原问题分解为规模较小的问题进行处理

分解后的问题与原问题类型完全相同,但规模较小。

通过小规模问题的解,能够轻易求得原生问题的解

B、问题的分解是有限的

当边界条件不能满足时,分解问题(继续递归)

当边界条件满足时,直接求解(递归结束)

二、递归在程序设计中的应用

递归函数:

函数体中存在自我调用的函数

递归函数必须有递归出口(边界条件)

函数的无限递归将导致程序崩溃

使用递归函数时不要陷入递归函数的执行细节,应首先建立递归模型和确立边界条件。

三、递归算法常见的应用场景

1.数据的定义是按递归定义的。如:斐波那契数列
2.问题解法按递归算法实现。如:递归求和
3.数据的结构形式是按递归定义的。如二叉树、广义表等

四、递归使用场景整理

1.树结构中使用递归

C#树结构操作逻辑整理

/// <summary>
/// 地区案例测试
/// </summary>
static void TestArea()
{
    List<Area> list = new List<Area>() {
        new Area(){ ID=1,Name="中国",ParentID=null},
        new Area(){ ID=2,Name="山东",ParentID=1},
        new Area(){ ID=3,Name="济南",ParentID=2},
        new Area(){ ID=4,Name="槐荫",ParentID=3},
        new Area(){ ID=5,Name="千乐微云",ParentID=4},

        new Area(){ ID=6,Name="市中区",ParentID=3},
        new Area(){ ID=7,Name="泉城广场",ParentID=6},
    };


    //转化为树结构展示
    var result = getChild(null, list);
    Console.WriteLine(result.ToJsonString());
}
/// <summary>
/// 递归处理子节点
/// </summary>
static List<Area> getChild(int? parentid, List<Area> source)
{
    List<Area> result = new List<Area>();
    //1.获取父节点
    List<Area> parent = source.Where(q => q.ParentID == parentid).ToList();
    if (parent.Count > 0)
    {
        //添加父类对象
        result.AddRange(parent);
        foreach (Area item in parent)
        {
            //循环父节点,获取子节点
            item.Children = getChild(item.ID, source);
        }
    }
    return result;
}

2.递归求和

/// <summary>
/// 递归求和
/// </summary>
static int Sum(int num)
{
    if (num == 1)
        return 1;
    return num + Sum(num - 1);
}

//递归求和
Console.WriteLine(Sum(1));//1
Console.WriteLine(Sum(2));//3
Console.WriteLine(Sum(3));//6
Console.WriteLine(Sum(4));//10

3.递归计算阶乘

/// <summary>
/// 递归阶乘
/// </summary>
static int Factorial(int num)
{
    if (num == 1)
        return 1;
    return num * Factorial(num - 1);
}


//递归阶乘
Console.WriteLine(Factorial(1));//1
Console.WriteLine(Factorial(2));//2
Console.WriteLine(Factorial(3));//6
Console.WriteLine(Factorial(4));//24

4.递归实现斐波那契数列

待完善.....

5.递归实现全排列

全排列算法(递归)封装

排列组合算法(递归)1

更多:

C#树结构操作逻辑整理

初学者开发流程_项目开发常见问题

二维码简介_二维码基本概念_二维码基本原理


http://www.kler.cn/news/107502.html

相关文章:

  • Vue引入异步组件
  • STM32F4X SDIO(二) SDIO协议
  • 使用Hystrix实现请求合并,降低服务器并发压力
  • Jquery 如何获取子元素。如何找到所有 HTML select 标签的选中项。jQuery 里的 ID 选择器和 class 选择器有何不同
  • 科聪协作(复合)移动机器人整体解决方案
  • 【JVM】类加载器
  • 指针进阶(1)
  • ce从初阶到大牛(两台主机免密登录)
  • 22、Python -- 创建对象和使用对象
  • 【394.字符串解码】
  • element-ui vue2 iframe 嵌入外链新解
  • STM32F4X SDIO(一) SD卡介绍
  • 星闪技术 NearLink 一种专门用于短距离数据传输的新型无线通信技术
  • 工业自动化产品抗干扰笔记
  • 【Elasticsearch】es脚本编程使用详解
  • OpenCV学习(六)——图像算术运算(加法、融合与按位运算)
  • 计算机视觉 激光雷达结合无监督学习进行物体检测的工作原理
  • [Unity]给场景中的3D字体TextMesh增加描边方案一
  • 指针仪表读数YOLOV8NANO
  • GPT出大错了!原来GPT不是万能的!这就是人类存在的意义!
  • sqoop和flume简单安装配置使用
  • Systemverilog中使用interface连接testbench和dut的端口
  • 铁轨(Rails, ACM/ICPC CERC 1997, UVa 514)rust解法
  • Kubernetes - Ingress HTTP 负载搭建部署解决方案(新版本v1.21+)
  • [双指针] Leetcode 283.移动零和1089.复习零
  • 设计模式:访问者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)
  • AT32固件库外设使用,ArduinoAPI接口移植,模块化
  • windows服务器环境下使用php调用com组件
  • 【springBoot】博客系统
  • 10000字!图解机器学习特征工程