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

c递归算法模型

使用递归算法模型可以较为自然地解决许多问题,尤其是对于那些数据结构层次比较清晰的问题,递归算法模型往往能够提供一种简单清晰的解法。

递归算法模型的核心思想是将一个大问题通过递归的方式拆分为若干个较小的问题,并不断递归下去直到问题变得足够简单,直接求解即可。这个思想实质上也是分治思想的一种应用,将大问题分解为若干个子问题,进而得到子问题的解,最后将子问题的解整合起来得到原问题的解。

但是在使用递归算法模型时也需要注意一些细节问题。以下是一些需要注意的事项:

1. 定义好递归函数的边界条件,避免递归进入无限循环,导致程序崩溃或者降低程序执行效率。

2. 在递归函数中尽可能不要使用全局变量,要使用参数传递的方法来传递函数所需的数据。

3. 递归算法模型的实现过程中如果存在大量计算,则很容易产生栈溢出,因此在使用递归算法模型时需要尽量避免出现超长递归链的情况。

4. 在递归过程中如果需要开辟新的内存空间,则需要注意内存泄漏问题,及时释放不需要的内存空间,避免程序长时间执行后内存溢出。

5. 在递归过程中如果需要访问外部数据结构,一定要注意访问的合法性,避免出现访问越界等错误。

6. 在递归过程中尽量避免使用递归调用层数过多的方式,可以通过设计合理的算法减少递归层数,提高效率。

7. 对于非线性的数据结构(如树、图等),递归算法模型非常适合,但是需要注意一些特殊情况,如避免形成环路等。

总之,递归算法模型能够很好地解决许多问题,但是需要注意细节问题,避免程序出现异常情况,从而实现高效稳定的程序执行。

// n个数阶乘
#include <stdio.h>int fun(int n)
{// 递归终止条件if (n <= 1){return 1;} else {return n * fun(n - 1);}}int main()
{int sum = fun(5);printf("n! = %d\n", sum);return 0;
}

// 递归问题——汉诺塔
#include<stdio.h>
int count = 0;
// 在汉诺塔问题中,每次只能移动一个圆盘
// 初始状态下最上边的圆盘编号是1,最底层的圆盘编号是n
// 每次递归调用时,需要将目标柱子和借助柱子的顺序调换,以便于完成移动
// 将n个圆盘从a借助b移到c
void hanoi(int n, char a, char b, char c)
{// 递归终止条件if (n == 1)// 移动操作printf("00 第 %-3d 次: %c --> %c\n", ++count, a, c);else{// 移动n-1个圆盘时,需要将这些圆盘从柱子a移动到柱子b,此时柱子c可以作为借助的柱子// 因此,需要将顺序调整为acbhanoi(n - 1, a, c, b);// 当移动晚n-1圆盘后,需要将最后一个圆盘从柱子a移动到柱子c// 因此需要输出一条指令,将圆盘a移动到圆盘c// 移动操作printf("01 第 %-3d 次: %c --> %c\n", ++count, a, c);// 然后,需要将n-1个圆盘从柱子b移动到柱子c,此时,柱子a可以作为借助的柱子// 因此,需要将顺序调整为bachanoi(n - 1, b, a, c);}
}int main()
{int n = 0;printf("请输入汉诺塔层数:");scanf("%d", &n);hanoi(n, 'a', 'b', 'c');printf("共移动了%d次\n", count);return 0;
}
// 斐波拉契数列是由一系列数字组成的序列。
// 该序列中的每一项都是前两项的和,起始项为0和1,第三项为1。
// 斐波拉契数列的前几个数字为:0,1,1,2,3,5,8,13,21,34,55,89,144,...
// 理解斐波拉契数列的方法有许多,其中一个常见的方法是通过兔子繁殖问题。
// 假设有一对新生的兔子,从第三个月开始,每对兔子每月可以繁殖一次,每次繁殖一对兔子。
// 第一个月新生的兔子还太小,不会繁殖,第二个月开始才开始繁殖。
// 设第 $n$ 个月时有 $F(n)$ 对兔子,则 $F(1)=F(2)=1$,当 $n>2$ 时,$F(n)=F(n-1)+F(n-2)$。// 在代码中我们用递归方式来求解斐波拉契数列。
// 函数的输入为要求的斐波拉契数列的前 $n$ 项,返回值为第 $n$ 项的数值。由于斐波拉契数列的定义中已经规定了前两项为 1 和 1,递归函数中的边界条件
// 即为当 $n<=1$ 时,返回 $n$。在递归调用的过程中,将求解 $n-1$ 项和 $n-2$项的函数值相加即可得到第 $n$ 项的数值。
// 我们在main函数中,通过循环依次输出前 $n$ 项的斐波拉契数列的值。比如当 $n=10$ 时,输出为:0,1,1,2,3,5,8,13,21,34。
// 需要注意的是,递归方式虽然简单,但是其时间复杂度较大,会出现较多重复计算的情况,因此计算高阶项时会比较慢。为了提高效率,可以使用非递归的方式实现斐波拉契数列的求解。#include <stdio.h>int fibonacci(int n)
{if (n <= 1) {return n;}return fibonacci(n-1) + fibonacci(n-2);
}int main()
{int n = 10;for (int i = 0; i < n; i++) {printf("%d ", fibonacci(i));}printf("\n");return 0;
}
// 迷宫问题
#include <stdio.h>#define ROW 5
#define COL 5int maze[ROW][COL] = {{0, 1, 0, 0, 0},{0, 1, 0, 1, 0},{0, 0, 0, 0, 0},{0, 1, 1, 1, 0},{0, 0, 0, 1, 0},
};// 标记是否已经访问过
int visited[ROW][COL] = {0};int findPath(int i, int j)
{// 判断是否越界,如果是则返回0,表示该路径不可行if (i < 0 || i >= ROW || j >= COL){return 0;}// 判断是否是障碍物或者已经访问过if (maze[i][j] == 1 || visited[i][j] == 1){return 0;}// 到达终点返回1,表示找到了一条可行路径if (i == ROW - 1 && j == COL - 1){visited[i][j] = 1;return 1;}// 如果当前位置不是终点,就标记为已经访问,然后递归调用findPath,分别向上下左右4个方向寻找路径visited[i][j] = 1;if (findPath(i+1, j) || findPath(i-1, j) || findPath(i, j-1) || findPath(i, j+1)){return 1;}// 如果4个方向都没有找到可行路径,就将当前位置标记为为访问,返回0visited[i][j] = 0;return 0;
}int main()
{// 调用if (findPath(0, 0)) {printf("找到路径!\n");} else {printf("没有找到路径。\n");}return 0;
}

相关文章:

c递归算法模型

使用递归算法模型可以较为自然地解决许多问题&#xff0c;尤其是对于那些数据结构层次比较清晰的问题&#xff0c;递归算法模型往往能够提供一种简单清晰的解法。 递归算法模型的核心思想是将一个大问题通过递归的方式拆分为若干个较小的问题&#xff0c;并不断递归下去直到问…...

力扣740. 删除并获得点数

动态规划 思路&#xff1a; 选择元素 x&#xff0c;获得其点数&#xff0c;删除 x 1 和 x - 1&#xff0c;则其他的 x 的点数也会被获得&#xff1b;可以将数组转换成一个有序 map&#xff0c;key 为 x&#xff0c; value 为对应所有 x 的和&#xff1b;则问题转换成了不能同…...

spring和springboot的区别

在当今的软件开发领域&#xff0c;Spring和Spring Boot无疑是Java开发者最常用的框架之一。尽管它们都源于Spring项目&#xff0c;但它们在设计和使用上有很大的不同。本文将深入探讨Spring和Spring Boot之间的主要区别&#xff0c;以及为什么有时候选择其中一个而不是另一个是…...

imgaug库图像增强指南(35):【iaa.Fog】——轻松创建自然雾气场景

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…...

网络安全--防御保护02

第二天重要的一个点是区域这个概念 防火墙的主要职责在于控制和防护---安全策略---防火墙可以根据安全策略来抓取流量之后做出对应的动作 防火墙的分类&#xff1a; 单一主机防火墙&#xff1a;专门有设备作为防火墙 路由集成&#xff1a;核心设备&#xff0c;可流量转发 分…...

UE5 C++学习笔记 常用宏的再次理解

1.随意创建一个类&#xff0c;他都有UCLASS()。GENERATED_BODY()这样的默认的宏。 UCLASS() 告知虚幻引擎生成类的反射数据。类必须派生自UObject. &#xff08;告诉引擎我是从远古大帝UObject中&#xff0c;继承而来&#xff0c;我们是一家人&#xff0c;只是我进化了其他功能…...

SpringBoot整合SSE

目录 1.SseController2. SseServiceSseServiceSseServiceImpl 3.SendMessageTask4.将定时任务加入启动类5.参考资料 1.SseController Slf4j RestController RequestMapping("sse") public class SseController {Autowiredprivate SseService sseService;RequestMappi…...

mysql-进阶篇

文章目录 存储引擎MySQL体系结构相关操作 存储引擎特点InnoDBInnoDB 逻辑存储结构 MyISAMMemory三个存储引擎之间的区别存储引擎的选择 索引1. 索引结构B-TreeB-Tree (多路平衡查找树)B-Tree演变过程 BTree与 B-Tree 的区别BTree演变过程 Hash 2.索引分类3.索引语法演示 4.SQL性…...

Js中的构造函数

在JavaScript中&#xff0c;构造函数是一种特殊类型的方法&#xff0c;用于创建并初始化一个新的对象。它通常使用 new 关键字来调用&#xff0c;并且通常以大写字母开头&#xff0c;以与其他非构造函数区分开来。 一个简单的构造函数示例&#xff1a; function Person(name,…...

[小程序]页面事件

一、下拉刷新 1.开启和配置 小程序中开启下拉刷新的方式有两种&#xff1a; ①全局开启下来刷新 在app.json的window节点中&#xff0c;设置enablePullDownRefresh设为ture。 ②局部开启下来刷新 在页面对应的json文件的的window节点中&#xff0c;设置enablePullDownRefresh设…...

vue echarts地图

下载地图文件&#xff1a; DataV.GeoAtlas地理小工具系列 范围选择器右侧行政区划范围中输入需要选择的省份或地市&#xff0c;选择自己想要的数据格式&#xff0c;这里选择了geojson格式&#xff0c;点右侧的蓝色按钮复制到浏览器地址栏中&#xff0c;打开的geojson文件内容…...

v38.Switch语句

1.Switch语句可以替代if-else语句 2.具体使用 Switch&#xff08;expression&#xff09; &#xff5b; case label&#xff1a;...... &#xff5d; ①将x与case后的label 进行比较&#xff1b; ②注意后面有冒号&#xff1b; ③从上往下开始检查case&#xff1b; ④如果…...

如何进行产品的人机交互设计?

产品的人机交互设计是指通过用户界面和用户体验设计来优化产品与用户之间的交互过程&#xff0c;从而提高产品的易用性、可用性和用户满意度。人机交互设计需要考虑用户的需求、行为模式、心理感受以及技术实现&#xff0c;下面我将介绍如何进行产品的人机交互设计。 首先&…...

【ARMv8M Cortex-M33 系列 7.3 -- EXC_RETURN 与 LR 及 PC 的关系详细介绍】

请阅读【嵌入式开发学习必备专栏 之 ARM Cortex-Mx专栏】 文章目录 背景EXC_RETURN 与 LR 及 PCcortex-m33 从异常返回后 各个寄存器出战顺序ARM 栈增长方式 背景 接着上篇文章&#xff1a;【ARMv8M Cortex-M33 系列 7.2 – HardFault 问题定位 1】&#xff0c;后面定位到是在…...

Linux之权限(内容详细,细节满满)

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力 目录 一.前言 二.权限修改的两种方法 …...

了解云工作负载保护:技术和最佳实践

云工作负载是指云环境中的应用程序或存储元素&#xff0c;无论是公共云、私有云还是混合云。每个云工作负载都使用云的资源&#xff0c;包括计算、网络和存储。 云工作负载可以多种多样&#xff0c;例如运行应用程序、数据库或托管网站。它们可以是静态的或动态的&#xff0c;…...

【Godot4自学手册】第三节设置主人公的动画

继续&#xff0c;今天是第三节&#xff0c;我们主要实现主人公的动画效果&#xff0c;共有两种方法实现动画效果 一、通过AnimationPlayer节点实现动画效果 我们首先在player场景下&#xff0c;player节点下添加AnimationPlayer节点&#xff0c;添加方法是&#xff0c;在play…...

excel学习1

直接ctrl cctrl v会报错位移选择粘贴时用123那个数字粘贴而不是ctrl V 只要结果不要公式 上面复制的为数值这里是复制的公式他们两个不一样 这个方法太麻烦了直接用格式刷&#xff0c;选择一个区域一个单元格&#xff0c;不要选择多个一刷就出来了 第一个计算后向下拖就行了&…...

裁员致谷歌中国籍程序员身亡,技术变革下裁员对程序员的影响有多大

裁员&#xff0c;这是一个令无数人心悸的词汇。在瞬息万变的科技时代&#xff0c;裁员仿佛成了不少公司应对困境的“救命稻草”。然而&#xff0c;在这背后&#xff0c;每一名员工&#xff0c;每一个程序员&#xff0c;他们所承担的代价&#xff0c;又有多少人能够深切地理解&a…...

MybatisPlus的主键ID生成策略和公共字段自动填充的使用及注意事项

主键策略&#xff08;ID自动生成&#xff09; 以下是MyBatis-Plus中常见的几种主键生成策略及其对应的枚举值&#xff08;3.3.0之前的版本&#xff09;&#xff1a; 主键生成策略枚举值数据库自增IdType.AUTO用户输入IdType.INPUT分布式全局唯一IDIdType.ID_WORKER分布式全局…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...