【新手解答8】深入探索 C 语言:递归与循环的应用
C语言的相关问题解答
- 写在最前面
- 问题:探索递归与循环在C语言中的应用
- 解析
- 现有代码分析
- 整合循环
- 示例代码修改
- 注意事项
- 结论
- 延伸:递归和循环的退出条件设置
- 解析
- 使用递归
- 使用循环
- 选择适合的方法
写在最前面
一位粉丝私信交流,回想起了当初的我C语言一题写一下午的,而且很多概念糊糊的不清楚。借助这次机会,整理了相关 C 语言中最常见而关键的疑惑,并对概念进行解答。
本篇博客的前身:
【新手解答1】深入探索 C 语言:变量名、形参 + 主调函数、被调函数 + 类和对象 + 源文件(.c 文件)、头文件(.h 文件)+ 库
【新手解答2】深入探索 C 语言:变量名、变量 + 函数声明 vs 函数定义 + main的声明 + 头文件和源文件的关系
【新手解答3】深入探索 C 语言:头文件提供必要的接口、源文件保持实现细节的私有性 + 进一步学习的方向 + 如何快速编写程序并最终能制作小游戏
【新手解答4】深入探索 C 语言:全局变量声明、全局函数声明 + 宏定义
【新手解答5】深入探索 C 语言:宏中的文本、标识符和字符串 + 递归运算、条件语句、循环 + switch-case
与多项条件和枚举的差别
【新手解答6】深入探索 C 语言:算法流程图(条件判断、循环)+ 字符常量 + switch的具体用法 + 关于namespace
+ import vs include
【新手解答7】深入探索 C 语言:代码缩进 + 变量作用域、静态变量 + 变量名和函数名重名
如有不对的地方欢迎指出!好久没接触C了hh
这章重点:
循环(loop)和递归(recursion)是两种不同的控制流机制。递归是通过函数自我调用
来实现重复的,而循环则是在同一函数体内重复执行代码块
。
问题:探索递归与循环在C语言中的应用
int f(int n) {int res;if (n == 1)res = 1;else{}res = f(n-1) + 3;return res;
}
上面代码是斐波那奇数列的,假如设置一个条件为n小于五,N大于五则减三,并再输入n判断大小,那么这个时候很明显是要用到循环的了,那么,这里的循环和函数又是什么关系呢?并且循环所包括的if会不会和else样重新输入?
解析
在深入探讨这个问题之前,让我们先理解一下代码片段所示的功能。
这段代码看似意在实现一个类似于斐波那契数列的递归函数,但实际上并未完全实现。
让我们先完善这个函数,然后讨论如何将循环逻辑集成到其中。
现有代码分析
int f(int n) {int res;if (n == 1)res = 1;else{// 递归调用缺失逻辑}res = f(n-1) + 3; // 这行代码会在所有情况下执行,包括n==1return res;
}
这段代码中存在一些问题:
- 递归基准条件:
if (n == 1) res = 1;
是递归的基准条件,但接下来的res = f(n-1) + 3;
也会在n == 1
的情况下执行,这可能导致无限递归。 - 递归逻辑:代码中
else
部分的逻辑尚未定义,这是实现递归的关键部分。
整合循环
现在,我们想要在 n
小于5时按一定规则执行,而 n
大于5时则按另一规则执行,并在此过程中使用循环。
这里的主要疑问是:如何将循环与递归函数结合
。循环和递归都是实现重复操作的方法,但它们在结构和用途上有所不同:
- 递归 是一种通过函数调用自身来重复执行代码的方法。
- 循环 通过结构(如
for
或while
循环)在一定条件下重复执行代码块。
要在此函数中整合循环,我们可以根据 n
的值在递归调用之前执行不同的循环逻辑。例如,如果 n
小于5,我们可以在递归调用之前执行一个循环;如果 n
大于5,我们则执行另一个循环。
示例代码修改
以下是根据描述修改后的函数示例:
int f(int n) {if (n == 1) {return 1;} else {if (n < 5) {// 在这里执行某种循环逻辑} else {// n大于5时的不同循环逻辑}return f(n-1) + 3;}
}
在这个示例中,if (n < 5)
和 else
部分是根据 n
的值执行不同的循环。这些循环可以是任何我们所需要的逻辑,例如增加、减少或者修改变量值。
注意事项
- 避免无限递归:确保递归函数有明确的退出条件,否则可能导致堆栈溢出。
- 递归与循环的选择:在某些情况下,使用循环而非递归可能更为高效,尤其是在深度递归可能导致性能问题的场景。
结论
结合循环和递归可以实现复杂的逻辑,但需要谨慎设计以避免常见的陷阱,如无限递归。根据具体的应用场景选择适当的方法是关键。
延伸:递归和循环的退出条件设置
对了,假如重新输入n- 3,如n=6,则n- 3=3,需要再次输入,那么,这按照赋值运算符来说就是,N=n- 3,但这样明显是不对的,又该怎样呢?
解析
我的理解是,想要在函数中实现一种逻辑,其中当 n
大于 5 时,将 n
减少 3,并对更新后的 n
值再次进行某种操作。
为了实现这个功能,在编程中通常可以通过递归或循环来实现。
让我们根据这个需求来设计这个函数。
使用递归
递归方法是一种函数在执行过程中调用自身的技术。在这个例子中,如果 n
大于 5,我们可以在函数中减少 n
的值,并再次调用这个函数。这样,每次调用都会检查 n
的值,并根据条件适当地更新 n
。
示例代码如下:
int f(int n) {if (n <= 5) {// 当n小于等于5时的处理逻辑return n; // 例如,直接返回n} else {// 当n大于5时,减少3并递归调用return f(n - 3);}
}
这个函数会递归地减少 n
的值,直到 n
小于或等于 5 为止。每次递归都会减少 n
的值。
使用循环
另一种方法是使用循环。在循环中,我们可以持续减少 n
的值,直到满足某个条件(例如,n
小于或等于 5)。
示例代码如下:
int f(int n) {while (n > 5) {n -= 3;}// 当n小于等于5时的处理逻辑return n; // 例如,直接返回n
}
在这个例子中,当 n
大于 5 时,循环会持续执行,并逐渐减少 n
的值。一旦 n
小于或等于 5,循环结束,函数返回当前的 n
值。
选择适合的方法
- 如果问题的性质更适合于逐步递减并递归地处理每个步骤,那么选择递归方法。
- 如果问题更倾向于简单地减少一个值直到达到某个阈值,那么使用循环可能更为简洁和高效。
在这两种情况下,都需要确保存在适当的退出条件,以防止无限递归或无限循环的发生。
相关文章:
【新手解答8】深入探索 C 语言:递归与循环的应用
C语言的相关问题解答 写在最前面问题:探索递归与循环在C语言中的应用解析现有代码分析整合循环示例代码修改注意事项结论 延伸:递归和循环的退出条件设置解析使用递归使用循环选择适合的方法 写在最前面 一位粉丝私信交流,回想起了当初的我C…...
服务器中深度学习环境的配置
安装流程 11.17 日,周末去高校参加学术会议,起因, 由于使用了某高校内的公共有线网络, 远程连接服务器后,黑客利用 ssh 开放的 22 端口, 篡改了主机的配置, 使得只要一连上网络, 服…...
html实现各种好看的鼠标滑过图片特效模板
文章目录 1.鼠标悬浮效果1.1 渐动效果1.2 渐变效果1.3 边框效果1.4 线行效果1.5 图标效果1.6 块状效果1.7 边线效果1.8 放大效果1.9 渐出效果1.10 痕迹效果1.11 交叉效果1.12 着重效果1.13 详展效果1.14 能动效果1.15 明细效果 2.主要源码2.1 源代码 源码下载 作者:…...
leetcode:LCR 122. 路径加密python3解法)
难度:简单 假定一段路径记作字符串 path,其中以 "." 作为分隔符。现需将路径加密,加密方法为将 path 中的分隔符替换为空格 " ",请返回加密后的字符串。 示例 1: 输入:path "a.a…...
vue中实现纯数字键盘
一、完整 代码展示 <template><div class"login"><div class"login-content"><img class"img" src"../../assets/image/loginPhone.png" /><el-card class"box-card"><div slot"hea…...
C#简化工作之实现网页爬虫获取数据
1、需求 想要获取网站上所有的气象信息,网站如下所示: 目前总共有67页,随便点开一个如下所示: 需要获取所有天气数据,如果靠一个个点开再一个个复制粘贴那么也不知道什么时候才能完成,这个时候就可以使用C…...
回顾过去的五年
回顾过去的五年 不知不觉,一晃就5年了。孩子也慢慢的长大了,都快和我一样高了。 2017-2019年依旧服务于原公司。后来公司停业了,得到了相应的赔偿。在家里呆了几个月,变成了无业游民。陪伴家人,也会收到家人的鞭策。…...
企业微信http协议接口调用,根据手机号搜索联系人
产品说明 一、 hook版本:企业微信hook接口是指将企业微信的功能封装成dll,并提供简易的接口给程序调用。通过hook技术,可以在不修改企业微信客户端源代码的情况下,实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…...
第三方支付原理
1.什么是第三方支付 所谓第三方支付,就是一些和各大银行签约、并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台。在通过第三方支付平台的交易中,买方选购商品后,使用第三方平台提供的账户进行货款支付,由第三方通知卖…...
logcat日志的使用——Qt For Android
前言 最近一直用qt开发安卓app,一直无法用真机调试,可能是缺什么东西。但是如果通过Qt Creator在真机上运行,可以在电脑控制台看打印(安卓本身的日志、qDebug之类的打印),所以我是通过打印猜测问题所在&am…...
软著项目推荐 深度学习的智能中文对话问答机器人
文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分:4.2 损失函数:4.3 搭建seq2seq框架:4.4 测试部分:4.5 评价NLP测试效果:4.6 梯度截断…...
灰度发布专题---3、Nginx+Lua灰度发布
上一章已经讲解了配置文件灰度发布、应用版本灰度发布、API网关灰度发布实现,但如果用户这时候在代理层如何做灰度发布呢? 代理层灰度发布分析 用户无论访问应用服务还是静态页,都要经过Nginx代理层,我们可以在Nginx这里做灰度发…...
冬天来了,波司登的高端化“春天”不远了?
最近,羽绒服频繁“贵”上热搜。 在众多热搜词条中,一条“国产羽绒服卖到7000元”的话题一度将波司登推上了舆论的风口浪尖。 对此,波司登在最新的业绩说明会上进行了回应,公司表示:“波司登旗下主品牌及子品牌将形成差…...
Vue3.0优点详解
相对于Vue2.0 3.0有了比较大的改进,优势主要有以下几点: 一、性能提升 1、Vue3.0的响应式系统使用了Proxy代理对象,取代了Vue2.0中的Object.defineProperty,使得Vue3.0的响应式系统更快、更灵活。 2、Vue3.0对TypeScript的支持更…...
Unity3D URP 自定义范围的特效热扭曲详解
前言 Unity3D URP(Universal Render Pipeline)是Unity官方推出的一款渲染管线,可以实现高效、高质量的图形渲染。在URP中,我们可以通过自定义特效来增强游戏的视觉效果。本文将详细解释如何使用URP实现一个自定义范围的特效热扭曲…...
Apache Flink(一):Apache Flink是什么?
🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录...
Wordpress自动定时发布怎么开通-Wordpress怎么自动发布原创文章
在当今数字化时代,博客已经成为许多人分享观点、经验和知识的重要平台。然而,对于博主们来说,每天按时发布一篇又一篇的文章可能是一项具有挑战性的任务。为了解决这个问题,一些创新的工具应运而生,其中包括WordPress的…...
VUE项目中问题学习总结(一)
文章目录 🍁自定义组件使用🍁clearInterval函数的使用🌿定时器的作用 🍁localStorage的使用🌿设置数据🌿获取数据🌿更新数据🌿删除数据 🍁VUE国际化配置🍁项目…...
使用K-means把人群分类
1.前言 K-mean 是无监督的聚类算法 算法分类: 2.实现步骤 1.数据加工:把数据转为全数字(比如性别男女,转换为0 和 1) 2.模型训练 fit 3.预测 3.代码 原数据类似这样(source:http:img-blog.csdnimg.cn…...
静态HTTP和动态HTTP有什么区别
静态HTTP是指网页内容在服务器上以静态文件的形式存在,每个页面都是固定的,不能根据用户的操作或输入进行改变。当用户请求一个静态页面时,服务器直接将页面的HTML代码返回给用户的浏览器进行显示。静态HTTP服务器的主要优点是速度快、简单易…...
分享66个在线客服JS特效,总有一款适合您
分享66个在线客服JS特效,总有一款适合您 66个在线客服JS特效下载 链接:https://pan.baidu.com/s/1VqM6ASgKRFdQ8RyzbsX4uA?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气࿰…...
Backend - Django JsonResponse HttpResponse
目录 一、关系 二、使用 (一)data 字典传值 1. JsonResponse 2. HttpResponse 3. 例子 (二)JsonResponse 有一个 safe 参数 (三)前端接收 1. 接收 JsonResponse 回传的值 2. 接收 HttpResponse 回…...
第四阶|自在行草 暄桐教室,林曦书法 从书法之美到生活之美
我这有很多的课程,需要了可以取用 新一期(入门课),目前已经更新完毕。 新一期(第一阶),目前已经更新完毕。 新一期(第二阶),目前已经更新完毕。 新一期&#…...
kubernetes详解——从入门到入土(更新中~)
k8s简介 编排工具:系统层面ansible、saltstackdocker容器docker compose docker swarm docker machinedocker compose:实现单机容器编排docker swarm:实现多主机整合成为一个docker machine:初始化新主机mesos marathonmesos …...
VScode异常处理 (因为在此系统上禁止运行脚本)
在使用 VScode 自带程序终端的时候会报出"系统禁止脚本运行的错误" 这是由于 Windows PowerShell执行策略导致的 解决办法 管理员身份运行 Windows PowerShell执行:get-ExecutionPolicy1,显示Restricted2执行:Set-ExecutionPoli…...
(5h)Unity3D快速入门之Roll-A-Ball游戏开发
DAY1:Unity3D安装 链接 DAY2:构建场景,编写代码 链接 内容:WASD前后左右移动、摄像机跟随 DAY3:待更新 DAY4:待更新 DAY5:待更新...
分享86个选项卡TABJS特效,总有一款适合您
分享86个选项卡TABJS特效,总有一款适合您 86个选项卡TABJS特效下载链接:https://pan.baidu.com/s/1NBtPP2tT5YQqi6c744tCqg?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气࿰…...
【Linux】Linux基础
文章目录 学习目标操作系统不同应用领域的主流操作系统虚拟机 Linux系统的发展史Linux内核版和发行版 Linux系统下的文件和目录结构单用户操作系统vs多用户操作系统Windows和Linux文件系统区别 Linux终端命令格式终端命令格式查阅命令帮助信息 常用命令显示文件和目录切换工作目…...
动态规划求解 fibonacci 数列
动态规划: 动态规划的基本思想是:将原问题拆分为若干子问题,自底向上的求解。是自底向上的求解,即是先计算子问题的解,再得出原问题的解。 思路: 创建一个数组,大小为n1,用于存储斐波那契数列的值。数组的…...
js最大公约数的实现有哪些办法
在JavaScript中,有几种常见的方法可以实现最大公约数(GCD)的计算。以下是其中一些方法: 辗转相除法(欧几里德算法): 辗转相除法是一种基于递归的算法,用于计算两个数的最大公约数。它…...
网站建设关键要素/优云优客百度推广效果怎么样
前言 HDFS是Hadoop的一部分。 Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件上的分布式文件系统。 HDFS是一个高度容错性的系统,适合部署在廉价的机器上。 HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。 HDFS放宽了一部分…...
煤矿建设工程质量监督总站网站/招代理最好的推广方式
纯属预告,不属广告:在windows server 2008这一块博客已经出了第一部“[为企业部署 Windows Server 2008 系列]”,总结如下:一、windows server 2008 部署条件:卍解[为企业部署Windows Server 2008系列一]二、完整安装模…...
成都做网站设/杭州seo中心
抽象类:对类的抽象,抽象其行为特征,分为数据抽象,即类的属性,过程抽象,即类的行为特征。抽象层次:是类的属性、行为抽象,全局进行抽象。是一种自下而上的设计。描述的是一继承关系&a…...
wordpress docs/外链代发平台
一、问题概述 生产者消费者模式是一个十分经典的多线程之间协作的模式,实际上主要包含了两类两类线程: 一类是生产者线程,用于生产数据; 一类是消费者线程,用于消费数据。 为了解耦生产者与消费者的关系&…...
想建个网站/合肥百度搜索排名优化
outline属性是用来设置一个或多个单独的轮廓属性的简写属性 , 例如 。 轮廓有下面几个属性: {outline-style: solid;outline-width: 10px;outline-color: red; } 他们有一种简写形式: {outline: 10px solid red; } 轮廓的特点: 轮…...
旅游网站建设目的/by网站域名
一、go的搭建 二、初识go 三、混个脸熟--go 四、go的语言结构 五、go的常量与变量 六、go基础数据类型 七、go 条件语句 八、go 运算符 九、go条件语句switch 十、go循环语句 十一、go之数组 十二、go初级函数 十三、go函数高级运用 十四、go之变量、指针、内存地址 十五、go之…...