【新手解答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服务器的主要优点是速度快、简单易…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
