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.mzph.cn/news/123358.shtml

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

相关文章

mysql如何查询数据出现的次数

在mysql中&#xff0c;可以利用select语句配合group by和count查询数据出现的次数&#xff0c;count能够返回检索数据的数目&#xff0c;语法为“select 列名,count(*) as count from 表名 group by 列名”。 count函数是用来统计表中或数组中记录的一个函数&#xff0c;count…

自定义控件的子控件布局(onLayout()方法)

onLayout()方法用于指定布局中子控件的位置&#xff0c;该方法通常在自定义的ViewGroup容器中重写。 重写onLayout()方法中的常用方法&#xff1a; getChildCount() 获取子控件数量 getChildAt( int index ) 获取指定index的子控件&#xff0c;返回View view.getVisibilit…

大语言模型系列

国产大模型开源一哥再登场&#xff0c;最强双语LLM「全家桶」级开源&#xff01;340亿参数超越Llama2-70B 为什么说大模型训练很难&#xff1f; - 知乎 GitHub - jeinlee1991/chinese-llm-benchmark: 中文大模型能力评测榜单&#xff1a;覆盖百度文心一言、chatgpt、阿里通义千…

C#学习系列之继承

C#学习系列之继承 啰嗦继承使用特殊基类隐藏方法实际使用总结 啰嗦 基础学习。 继承 一个类派生于另一个基类型&#xff0c;它拥有该基础类型的所有成员字段和函数。A派生于B&#xff0c;继承A的所有东西&#xff0c;同时可以增加自己的东西。 使用 public class parent {p…

bootstrap.yml文件未加载

springcloud2020.X.X版本官方重构了bootstrap引导配置的加载方式 需要添加以下依赖才能提高bootstrap.yml文件加载的优先级 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId&g…

Spring-声明式事务

声明式事务 一、简介1、准备工作2、测试 二、声明式事务概念1、编程式事务2、声明式事务3、基于注解的声明式事务1.测试无事务情况2.加入事务①Transactional注解标识的位置②事务属性&#xff1a;只读③事务属性&#xff1a;超时④事务属性&#xff1a;回滚策略⑤事务属性&…

《Effective C++》知识点(4)--设计与声明

18. 让接口容易被正确使用&#xff0c;不易被误用 18.1 好的接口很容易被正确使用&#xff0c;不容易被误用。你应该在你的所有接口中努力达成这些性质。任何接口如果要求客户必须记得做某些事情&#xff0c;就有着"不正确使用"的倾向。 18.2 "促进正确使用&quo…

文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题

四、用go语言&#xff0c;对于一个含 n个结点的任意有根树&#xff0c;写出一个 O(n)时间的过程&#xff0c;输出其所有关键字该树以左孩子右兄弟表示法存储。 文心一言&#xff1a; 在计算机科学中&#xff0c;左孩子右兄弟表示法是一种用于表示树状结构的方法&#xff0c;其…

解决Maven打包Nacos时插件报错

Maven打包指令&#xff1a;mvn clean install -Dmaven.test.skiptrue -Dcheckstyle.skiptrue 在执行时报错&#xff0c;报错信息如下&#xff1a; Failed to execute goal org.xolstice.maven.plugins:protobuf-maven-plugin:0.6.1:compile (default) on project nacos-consist…

gradle多模块依赖管理最佳实践

gradle多模块依赖管理最佳实践 多模块项目依赖管理定义子模块使用buildSrc定义插件SofastModulePluginOptional 依赖 增加dependencies子模块其他子模块web 多模块项目依赖管理 依赖管理是项目开发过程中必不可少的操作&#xff0c;在gradle如何优雅的管理多个模块依赖是一个非…

软考下午第一题 案列分析

期待分值 10&#xff0c;前三问12左右分&#xff0c;最后一题2、3分左右&#xff0c;重点在于拿下前面三题。 小心谨慎&#xff0c;不要大意。 数据流图 外部系统 数据存储 加工&#xff08;&#xff09;process 数据流 第二小题 说明给出存储名称&#xff0c;就使用该名称&…

k8s 1.28版本:使用StorageClass动态创建PV,SelfLink 问题修复

k8s中提供了一套自动创建 PV 的机制&#xff0c;就是基于 StorageClass 进行的&#xff0c;通过 StorageClass 可以实现仅仅配置 PVC&#xff0c;然后交由 StorageClass 根据 PVC 的需求动态创建 PV。 问题&#xff1a;   使用 k8s 1.28版本&#xff0c;通过 kubectl get pv…

走进国产机器人领军品牌华数机器人,共探数字化变革魔力

近日&#xff0c;纷享销客举办的“一院两司服务对接会暨走进纷享销客【数字化标杆】游学示范基地活动”在佛山顺利举行&#xff0c;本期活动走进华中数控旗下品牌、国家级专精特新“小巨人”企业华数机器人&#xff0c;特邀佛山华数机器人有限公司常务副总经理杨林、纷享销客广…

【vue3】样式穿透、完整新特性、动态css、css-module

一、样式穿透 vue2里面使用 /deep/ vue3里面使用 :deep() :deep(.el-input__inner){background-color: red; }二、完整新特性 :slotted() //parent.vue <template><div><p>这是父级</p><span></span><A><p class"red"…

高级深入--day44

Scrapy 和 scrapy-redis的区别 Scrapy 是一个通用的爬虫框架&#xff0c;但是不支持分布式&#xff0c;Scrapy-redis是为了更方便地实现Scrapy分布式爬取&#xff0c;而提供了一些以redis为基础的组件(仅有组件)。 pip install scrapy-redis Scrapy-redis提供了下面四种组件&a…

Unable to find GatewayFilterFactory with name TokenRelay

目录 问题分析解决方案参考文档开源项目微服务商城项目前后端分离项目 问题分析 Spring Cloud Gateway 网关作为代理资源服务器&#xff0c;需要将 JWT 传递给下游资源服务器&#xff0c;下面是网关的配置 spring:cloud:gateway:discovery:locator:enabled: true # 启用服务发…

Linux 块设备驱动实验

前面我们都是在学习字符设备驱动&#xff0c;本章我们来学习一下块设备驱动框架&#xff0c;块设备驱动是 Linux 三大驱动类型之一。块设备驱动要远比字符设备驱动复杂得多&#xff0c;不同类型的存储设备又 对应不同的驱动子系统&#xff0c;本章我们重点学习一下块设备相关驱…

.NET、VUE利用RSA加密完成登录并且发放JWT令牌设置权限访问

后端生成公钥私钥 使用RSA.ToXmlString(Boolean) 方法生成公钥以及私钥。 RSACryptoServiceProvider rSA new(); string pubKey rSA.ToXmlString(false);//公钥 string priKey rSA.ToXmlString(true);//私钥 后端将生成的公钥发送给前端 创建一个get请求&#xff0c;将…

光流估计(二) FlowNet 系列文章解读

在上篇文章中&#xff0c;我们学习并解了光流&#xff08;Optical Flow&#xff09;的一些基本概念和基本操作&#xff0c;但是传统的光流估计方法计算比较复杂、成本较高。近些年来随着CNN卷积神经网络的不断发展和成熟&#xff0c;其在各种计算机视觉任务中取得了巨大成功&am…

【剑指offer|图解|双指针】移除元素 + 合并两个有序数组

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、算法模板、汇编语言 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️移除元素二. ⛳️合并两个有序数组&#x1f4dd;全文总结 &#…