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

news2024/11/28 16:35:00

一、递归简介

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

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

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

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

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.coloradmin.cn/o/1145970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正五边形的周长 题解

描述 已知一个正五边形的一条边的长度是a&#xff0c;计算输出该正五边形的周长。 输入 一行一个正整数a&#xff0c;表示该正五边形的边长。a的数值不会超过int的范围。 输出 一行一个正整数&#xff0c;表示这个该正五边形的周长&#xff0c;也就是5条边加起来的和。 输入样…

计网小题题库整理第一轮(面向期末基础)(1)

整理了一部分选择和填空&#xff0c;比较基础。计网的核心在于&#xff1a;背就完事~ 一.填空题 在采用电信号表达数据的系统中&#xff0c;数据有数字数据 和 模拟数据 两种。域名系统 DNS 是一个 分布式数据库 系统。TCP/IP 的网络层最重要的协议是 IP 互连网协议&#xff0…

STM32GPIO有几种模式,

一&#xff1a;GPIO有八种模式 输入&#xff1a; GPIO_Mode_AIN 模拟输入 GPIO_Mode_IN_FLOATING 浮空输入 GPIO_Mode_IPD 下拉输入 GPIO_Mode_IPU 上拉输入 输出 GPIO_Mode_Out_OD 开漏输出 GPIO_Mode_Out_PP 推挽输出 GPIO_Mode_AF_OD 复用开漏输出 GPIO_Mode_AF_PP 复用推挽…

数组与链表算法-单向链表算法

目录 数组与链表算法-单向链表算法 C代码 单向链表插入节点的算法 C代码 单向链表删除节点的算法 C代码 对单向链表进行反转的算法 C代码 单向链表串接的算法 C代码 数组与链表算法-单向链表算法 在C中&#xff0c;若以动态分配产生链表节点的方式&#xff0c;则可以…

标准ACL,扩展ACL,基本ACL,高级ACL

其实标准ACL&#xff0c;扩展ACL&#xff0c;基本ACL&#xff0c;高级ACL是同一个概念的不同名称&#xff0c;区别在于: 思科路由器支持标准ACL和扩展ACL两种类型的访问控制列表&#xff0c;没有”基本ACL“和”高级ACL“的概念&#xff0c;而华为路由器都支持 编号范围&…

2024年天津中德应用技术大学专升本自动化专业基础考试大纲

天津中德应用技术大学自动化专业&#xff08;高职升本科&#xff09;2024年专业基础考试大纲 一、试卷类型&#xff08;仅供参考&#xff09; 试卷卷面成绩共200分&#xff0c;考试时间为2小时。内容包含电工基础30%&#xff0c;电子技术30%&#xff0c;电机原理与拖动40%。试…

PLC程序常用模块

常用程序块 中继复位&#xff08;使用特殊中继SM&#xff09;初始化置位&#xff08;set&#xff09;初始化急停互锁按时断电模块&#xff08;按下按钮&#xff0c;1s后自动断电&#xff09;一次性开关循环的几种方法并联常开点定时器循环&#xff08;串联常闭&#xff0c;断电…

对Happens-Before的理解

Happens-Before Happens-Before 是一种可见性模型&#xff0c;也就是说&#xff0c;在多线程环境下。原本因为指令重排序的存在会导致数据的可见性问题&#xff0c;也就是 A 线程修改某个共享变量对 B 线程不可见。因此&#xff0c;JMM 通过 Happens-Before 关系向开发人员提供…

使用 kube-downscaler 降低Kubernetes集群成本

新钛云服已累计为您分享772篇技术干货 介绍 Kube-downscaler 是一款开源工具&#xff0c;允许用户定义 Kubernetes 中 pod 资源自动缩减的时间。这有助于通过减少非高峰时段的资源使用量来降低基础设施成本。 在本文中&#xff0c;我们将详细介绍 kube-downscaler 的功能、安装…

Vue全局事件总线实现任意组件间通信

一、安装全局事件总线 全局事件总线就像是一个工具&#xff0c;专门用于挂载自定义事件和。 想要所有的组件都能使用这个全局事件总线&#xff0c;就只有在Vue的原型身上添加一个能够绑定自定义事件的属性。 所以我们在创建Vue实例对象的时候就可以添加如下代码&#xff1a;…

C语言实现将密码译回原文,并输出密码和原文

完整代码&#xff1a; // 有一行电文&#xff0c;已按下面规律译成密码&#xff1a; // A→Z a→z // B→Y b→y // C→X c→x /*即第 1 个字母变成第 26 个字母&#xff0c;第 i 个字母变成第&#xff08;26-i1&#xff09;个字母&#xff0c;非字母字 符不变。要求编程序将…

UVa129 Krypton Factor(困难的串)

1、题目 2、题意 如果一个字符串包含两个相邻的重复子串&#xff0c;则称它是“容易的串”&#xff0c;其他串称为“困难的串”。例如&#xff0c;BB、ABCDACABCAB、ABCDABCD都是容易的的串&#xff0c;而D、DC、ABDAB、CBABCBA 都是困难的串。 输入正整数 k k k 和 L L L&a…

JavaScript_对象_Function_定义与参数

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Function对象</title><script>/*** Function&#xff1a;函数&#xff08;方法&#xff09;对象* 1.创建&#xff1a;* 1.…

cosover是什么?crossover23又是什么软件

cosover是篮球里的过人技巧。 1.crossover在篮球中的本意是交叉步和急速交叉步。crossover 是篮球术语&#xff0c;有胯下运球、双手交替运球&#xff0c;交叉步过人、急速大幅度变向等之意。 2.在NBA里是指包括胯下运球、变向、插花在内的过人的技巧。 NBA有很多著名的Cross…

3.5 Early-Z 与 Z Prepass

一、深度测试DepthTest 1.传统渲染管线中的深度测试 深度测试在逐片元操作中的第二步 2.解决物体可见遮挡性的问题 3.深度测试的逻辑 for(each triangle T) //对每一个三角形 { for(each fragment(x,y,z) in T)//对每一个三角形中的片元 { if(fragment.z < ZBuffe…

IOC课程整理-13 Spring校验

1. Spring 校验使用场景 2. Validator 接口设计 3. Errors 接口设计 4. Errors 文案来源 5. 自定义 Validator 6. Validator 的救赎 7. 面试题精选 Spring 校验接口是哪个 org.springframework.validation.Validator Spring 有哪些校验核心组件&#xff1f;

嵌入式项目电灯

1、原理&#xff0c;电灯有个正负极&#xff0c;当正确接入电源正负极就能点亮&#xff08;如正极5v,负极0v&#xff09;&#xff0c;单两边同时接入正极&#xff0c;就不会亮&#xff08;两端都是5v&#xff09;,所以通过控制电平&#xff0c;来实现控制led等的亮暗 cpu通过给…

Eclipse:编译前自动保存文件

Eclipse默认不会在编译前保存文件&#xff0c;所以有时修改了半天程序&#xff0c;但是忘记保存&#xff0c;结果编译报的问题与代码不一致&#xff0c;甚至调试半天才发现是文件没有保存&#xff0c;很是让人恼怒。 可以通过以下设置&#xff0c;让Eclipse在编译前自动保存文…

如何快速排查SSD IO延迟抖动问题?

一块固态硬盘设计背后&#xff0c;有硬件控制器&#xff0c;NAND闪存颗粒、DRAM&#xff0c;还有固件FTL算法等。SSD设计的本身其实是一件特别复杂的过程&#xff0c;需要考虑各种客户需求且要保证可靠性、性能、稳定性。 针对SSD的相关性能测试&#xff0c;SNIA也有专门针对SS…

制作自己的前端组件库并上传到npm上

最近实现了自己的一个前端组件库demo&#xff0c;目前只上传了几个小组件。话不多说&#xff0c;上图&#xff1a; 我分了三个项目&#xff1a;yt-ui组件库、使用文档、demo。线上地址如下&#xff1a; [yt-ui组件库](mhfwork/yt-ui - npm) [组件库使用文档](介绍 | mhfwork/y…