【新手解答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服务器的主要优点是速度快、简单易…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...