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

函数递归调用原理

1. 什么是递归2. 递归的举例3. 递归与迭代1. 什么是递归递归就是一种解决方法在C语言中递归就是函数调用自己。下面是一个简单的递归C语言程序#include stdio .h int main() { printf(hello world\n); main();//main函数中又调用了main函数 return 0; }如上注释main会递归调用自己这样只是为了展示递归的基础程序不是为了解决问题所以程序会进入死循环导致栈溢出。1.1.递归的思路我们可以把它当做跟forwhile等循环解决问题一样当成一种解决问题的方法但它主要是把大问题化解成小问题主要思路主要是递推跟回归接下来我带你们慢慢体会1.2.递归的限制条件跟forwhile一样它也有限制条件不过它只有两个限制条件。·递归需要有个限制条件这个限制条件将关乎递归的结束·每次递归过后都越来越接近限制条件1.3.函数递归的优缺点优点函数递归只需少量的程序就可描述出解题过程所需要的多次重复计算大大地减少了程序的代码量。缺点①如果函数递归使用不恰当会导致栈溢出②函数不返回函数对应的栈帧空间就一直占用所以如果函数调用中存在递归调用的话每一次递归函数调用都会开辟属于自己的栈帧空间直到函数递归不再继续开始回归才逐层释放栈帧空间。这样就会大大占用栈帧空间同时大大降低代码的执行效率。关于函数栈帧如下在C语言中每一次函数调用都需要为本次函数调用在内存的栈区申请一块内存空间来保存函数调用期间的各种局部变量的值这块空间被称为运行时堆栈或者函数栈帧。2. 递归的举例与实现我们了解了递归的底层逻辑接下来我们来看几个程序来看一下递归如何实现2.1求n的阶乘题目∶计算n的阶乘不考虑溢出。2.1.1分析跟代码实现n的阶乘的公式:n!n*(n-1)!从中我们发现这个思路就是把一个数的阶乘换成比它小一个的数的阶乘然后一层一层把大问题细小化其中的限制条件就是n0。上面的函数Fact函数就是递归调用的函数其中的特殊情况就是当n0时Fact1那我们就可以写出这个函数假设Fact(n)就是求n的阶乘那么Fact(n-1)就是求n-1的阶乘函数如下∶int Fact(int n) { if(n0) return 1; else return n*Fact(n-1); }运行结果不需要考虑n太大的问题n太大存在溢出。如果还是觉得难懂的话下面有个图可以直观体现出递归思路而如果我们不用递归的话就只用循环的话一层循环就可以了代码如下#define _CRT_SECURE_NO_WARNINGS 1 #includestdio.h int main() { int i 0; int n 0, end 1; scanf(%d, n); for (i 1; i n; i) { end * i; } printf(%d, end); return 0; }2.2顺序打印输入一个整数的每一位例如∶输入1234 打印1 2 3 42.2.1分析和代码实现解题思路∶当输入n的值是一位数输出的n反之则拆分n的每一位。而我们就需要取模跟取余的方式得到n的每一位例如1234%1041234%10123整型会自动约分为整数然后一步一步得到每一位。但这种情况如果直接输出的话就会输出4 3 2 1所以我们可以用递归的方式反向输出这样就可以输出1 2 3 4了可以用下面的表达式来体现递归的方法Print(1234)Print(123) printf(4)Print(12) printf(3)Print(1) printf(2)printf(1)Print函数的限制条件是当数字为一位数时返回所有值然后递归结束。下面是代码实现∶#define _CRT_SECURE_NO_WARNINGS 1 #includestdio.h int Print(int x) { if (x 9) { Print(x / 10); } printf(%d , x % 10); } int main() { int n 0; scanf(%d, n); Print(n); return 0; }2.3模拟实现strlen函数例如∶输入abc 输出32.3.1分析和代码实现首先我们要知道strlen函数是计算字符串‘\0’之前的长度但我们如果要实现的话就需要设计一个my_strlen函数这个函数每遇见一个衣服函数值加1直至到‘\0’结束可以用下面的表达式来体现递归的方法my_strlen(abc)--------------这里是指针在移动1my_strlen(bc)1my_strlen(b)1my_strlen(‘\0’)当满足我们的限制条件’\0’时返回0然后回归my_strlen函数限制条件就是‘\0’下面是代码实现int my_strlen(char* str) { if (*str ! \0) { return 1 my_strlen(str 1);//strlen函数的模拟实现方式 } return 0; } int main() { char arr[] abc; int ret my_strlen(arr); printf(%d, ret); return 0; }2.4求n的k次幂例如∶输入3 3 输出272.4.1分析和代码实现解题思路∶首先对k进行分析当k0时无论n为几函数最后返回值都为1当k1时每一次递推就乘以n而k-1直至k0。其中有一个隐含条件就是k不会0。同样也可以用下面的表达式来体现递归n3 k3Pow33n*Pow33-1n*Pow32-1n*31-1当k0时函数返回1下面是代码实现int Pow(int x, int y) { while (y) { return x*Pow(x, y - 1); } } int main() { int n 0, k 0; scanf(%d %d, n, k); int cPow(n, k); printf(%d, c); return 0; }3.递归与迭代我们看到的许多问题是以递归的形式进⾏解释的这只是因为它⽐⾮递归的形式更加清晰但是这些问题的迭代实现往往⽐递归实现效率更⾼。当⼀个问题⾮常复杂难以使⽤迭代的⽅式实现时此时递归实现的简洁性便可以补偿它所带来的运行时开销。二者是相辅相依的。下面我们用一个题来看下他们之间的区别3.1斐波那契数列递归实现与迭代实现3.1.1递归分析和代码实现解题思路∶斐波那契系数是前两项加起来等于后一项11235813…,所以我们可以以n2为限制条件当n1或2时返回1然后到n3项时就是n1项和n2项之和然后依次往后推即Fib(n)就是Fib(n-1)和Fib(n-2)之和。可以用下面的表达式来体现递归Fib(n)Fib(n-1) Fib(n-2)Fib(n-2)Fib(n-3) , Fib(n-3)Fib(n-4)…一直递推下去直至到Fib(1)和Fib(2)返回值为1然后回归得到第n个斐波那契数。下面还有一个图来帮助我们设计Fib函数递归代码实现∶int Fib(int x) { if (x 2) { return 1; } else { return Fib(x - 1) Fib(x - 2); } } int main() { int n 0; scanf(%d, n); int ret Fib(n); printf(%d, n); return 0; }3.1.2迭代分析和代码实现解题思路∶可以参考上面递归实现的思路我们可以用三个变量相互替换来解决n1为第一项n2为第二项tmp为第三项运用while()循环每一次循环n就减1直到n2最后输出tmp。限制条件当n2输出的值都是1反之当n2时循环开始n2时循环结束下面是迭代代码实现int Fib(int n) { int a 1; int b 1; int c 1; if (n 2) { return 1; } while(n2) { c a b; a b; b c; n--; } return c; } int main() { int n 0; scanf(%d, n); int ret Fib(n); printf(%d, ret); return 0; }3.2斐波那契数列中递归与迭代的区别当我们尝试输入50时我们可以发现递归的计算时间会非常长这个计算所花费的时间说明递归的效率是非常低的这是为什么呢下面一张图可以带给我们答案其实递归程序会不断的展开在展开的过程中我们很容易就能发现在递归的过程中会有重复计算⽽且递归层次越深冗余计算就会越多。而这些程序的计算结果不会共享每次计算都会重新计算这是因为函数栈帧的创建与销毁每次调用函数都会在函数栈帧上开辟空间同时完成函数是有要销毁这些空间。这样就大大降低了运行效率。而当我们用迭代的方法时会发现其实现的效率就比递归的效率高多了这是为什么呢这是因为每一次循环n1,n2,tmp会被赋值代码执行次数大大减少也就大大提高了代码的执行效率。

相关文章:

函数递归调用原理

1. 什么是递归 2. 递归的举例 3. 递归与迭代1. 什么是递归递归就是一种解决方法&#xff0c;在C语言中&#xff0c;递归就是函数调用自己。下面是一个简单的递归C语言程序&#xff1a;#include <stdio .h>int main(){printf("hello world\n");main();//main函数…...

AI智能切片不是‘一键分割’就完事:批量口播视频的工程化切片陷阱与工具选型

Hook你是否试过把一小时口播音频丢进某款‘AI切片工具’&#xff0c;结果导出37条视频——其中12条开头卡在‘呃…’上&#xff0c;8条结尾截断在半句话里&#xff0c;还有5条字幕和画面完全不同步&#xff1f;更糟的是&#xff0c;换一批素材&#xff0c;模型表现又不稳定。这…...

AI 自动剪辑不是‘一键成片’:90% 的技术团队踩在逻辑断层与工程适配陷阱里

当团队首次将「AI 自动剪辑」纳入短视频生产管线时&#xff0c;最典型的误判是把它当作一个黑盒触发器&#xff1a;导入原始素材 → 点击「智能剪辑」→ 导出成品。这种认知忽略了背后三重断裂——语音转写与气口检测的精度断层、镜头语义理解与叙事逻辑的错位、以及单机操作与…...

ChatGPT高质量输出的隐藏开关:基于IEEE写作标准的11项自动校验清单(附可运行Python验证脚本)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;ChatGPT高质量输出的底层逻辑与认知前提 ChatGPT生成高质量响应并非依赖“魔法”&#xff0c;而是建立在三个核心支柱之上&#xff1a;大规模语言建模的统计涌现能力、人类反馈强化学习&#xff08;RLHF&#…...

智能戒指制造商Oura秘密提交IPO申请,累计融资15亿美元,付费会员有望破500万

5月22日消息&#xff0c;据《华尔街日报》报道&#xff0c;智能戒指制造商Oura已秘密提交首次公开募股&#xff08;IPO&#xff09;申请。该产品获多位名人称赞&#xff0c;销量可观&#xff0c;此次IPO表现值得关注。产品功能与背景Oura智能戒指能追踪心率、皮肤温度等指标&am…...

Spring框架30道高频面试题(详细答案版)

本套面试题涵盖Spring核心基础、IoC容器、Bean生命周期、AOP、事务管理、依赖注入、Spring循环依赖、Spring配置、底层原理等高频核心考点&#xff0c;答案精简专业、适配面试作答&#xff0c;适合Java后端求职复习。一、Spring基础核心&#xff08;1-6题&#xff09;1. 什么是…...

NotebookLM时间线创建全解析,手把手教你用AI自动生成可交互知识图谱

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM时间线创建的核心价值与适用场景 NotebookLM 的时间线&#xff08;Timeline&#xff09;功能并非简单的时间戳罗列&#xff0c;而是将文档片段、引用来源与用户思考按真实发生顺序动态编织成…...

Java 高级特性高频面试题 30 道(含答案)【简洁版】

覆盖泛型、反射、注解、Lambda/Stream、函数式接口、动态代理、JDK8 新特性、线程池、JVM、IO/NIO、序列化等核心高频考点&#xff0c;适合中高级 Java 工程师面试。一、泛型&#xff08;3 题&#xff09;什么是 Java 泛型&#xff1f;泛型的作用是什么&#xff1f;答案&#…...

今年小满不一般,老辈农谚里藏着农事提醒

2026 年的小满节气在 5 月 21 日 8:36:28 交节&#xff0c;不少人说今年小满不一般&#xff0c;老辈农谚里总结了三个特点&#xff0c;对农事有不少参考意义。1. 白天小满&#xff0c;昼夜温差变化大“白天小满凉嗖嗖&#xff0c;晚上小满热死牛”这句农谚是说&#xff0c;如果…...

2026年如何向 GPT-5.5 提问,拿到更高质量的技术解释和方案

摘要&#xff1a; 2026年的工具生态正在从“追大模型”转向“讲效率、讲成本、讲合规”。本文结合当前小模型高效化、国产工具崛起、多模型聚合的趋势&#xff0c;分享一套面向 GPT-5.5 的高质量提问方法&#xff0c;帮助开发者和普通用户更快拿到清晰、可执行、可落地的技术答…...

一个月 SQL 学习总结:LeetCode 高频 SQL 50 题刷题心得

最近花了一个月时间系统学习 SQL&#xff0c;主要是跟着 LeetCode 的「高频 SQL 50 题&#xff08;基础版&#xff09;」进行练习。 回过头来看&#xff0c;这一个月的学习虽然不算特别长&#xff0c;但让我对 SQL 的理解比以前清晰了很多&#xff0c;也积累了一些适合初学者的…...

医用超声图像灰阶图算法:原理、实现与应用

引言 医用超声成像作为一种无创、实时、无辐射的影像学检查手段,在临床诊断中扮演着至关重要的角色。超声设备采集到的原始信号是射频(RF)信号,而最终呈现在医生面前的,是经过一系列复杂算法处理后的灰阶图像(B-mode图像)。灰阶图算法正是将原始超声回波信号转换为可视…...

医用超声图像干扰处理方法:原理、技术与实践

引言 超声成像作为一种无创、实时、无辐射的医学影像技术,在临床诊断中发挥着至关重要的作用。然而,超声图像在采集过程中极易受到各种物理和电子干扰,导致图像质量下降,影响医生的诊断准确性。常见的干扰包括斑点噪声、混响伪影、声影、镜面伪影以及由患者呼吸、运动引起…...

Perseus补丁:碧蓝航线全皮肤解锁完整指南与快速配置教程

Perseus补丁&#xff1a;碧蓝航线全皮肤解锁完整指南与快速配置教程 【免费下载链接】Perseus Azur Lane scripts patcher. 项目地址: https://gitcode.com/gh_mirrors/pers/Perseus 还在为碧蓝航线中那些精美皮肤需要付费而烦恼吗&#xff1f;想要免费体验所有舰娘的不…...

Office Custom UI Editor终极指南:30秒打造专属Office工作界面

Office Custom UI Editor终极指南&#xff1a;30秒打造专属Office工作界面 【免费下载链接】office-custom-ui-editor Standalone tool to edit custom UI part of Office open document file format 项目地址: https://gitcode.com/gh_mirrors/of/office-custom-ui-editor …...

Windows 11终极优化指南:用Win11Debloat一键清理系统,性能提升51%

Windows 11终极优化指南&#xff1a;用Win11Debloat一键清理系统&#xff0c;性能提升51% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other chang…...

G-Helper终极指南:如何用免费开源工具彻底替代Armoury Crate

G-Helper终极指南&#xff1a;如何用免费开源工具彻底替代Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbo…...

IO、NIO、Netty实战

目标 客户端和服务端互相通信&#xff0c;本文主要是实战练习&#xff0c;照着敲&#xff0c;然后debug看为什么就行 前置理解模型核心类特点简述BIOServerSocket / Socket一个连接一个线程&#xff0c;accept() 和 read() 都会阻塞简单但连接多了线程爆炸NIOSelector / Server…...

Taotoken助力企业级AI应用开发,统一管理多个Agent的API成本与用量

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken助力企业级AI应用开发&#xff0c;统一管理多个Agent的API成本与用量 当团队同时运行多个基于不同大模型的智能体应用时&a…...

水葫芦生长周期生长阶段早晚期检测数据集VOC+YOLO格式1029张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;1029标注数量(xml文件个数)&#xff1a;1029标注数量(txt文件个数)&#xff1a;1029标注类别…...

夏天来了TEMU爆单指南:我用凌风工具箱“标签模板“搞定夏季爆款

嘿&#xff0c;我是小彭&#xff0c;一个在跨境电商圈摸爬滚打的老玩家&#x1f64b;♂️。这周在朋友圈晒出单周GMV破300万的成绩单&#xff0c;评论区直接炸了&#xff1a;"你这波操作可以啊""啥时候开个课教教我们"。说实话&#xff0c;真没什么高深技巧…...

抖音下载工具终极指南:如何免费保存视频、直播和合集内容

抖音下载工具终极指南&#xff1a;如何免费保存视频、直播和合集内容 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...

第37天:SQL详解之DDL

Python学习100天(从入门到精通系列文章) 文章目录 Python学习100天(从入门到精通系列文章) 前言 一、SQL概述 1.1 建库建表 1.2 DDL关键注意事项 二、存储引擎对比 三、数据类型选择 四、删除表和修改表 4.1 删除表 4.2 修改表 总结 前言 在前一篇文章中,我们了解了关系型…...

通过Taotoken审计日志功能追踪团队API使用情况的实际案例

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过Taotoken审计日志功能追踪团队API使用情况的实际案例 1. 背景与需求 在团队协作开发中&#xff0c;多个成员或项目共享大模型…...

上班族开例会懒得记要点?2026年这3款AI总结工具,会后自动整理纪要

做互联网运营四年&#xff0c;开会已经成了每天的常态。部门周例会、项目复盘会、线上培训课、远程沟通会&#xff0c;大大小小的视频会议一场接一场。以前最让我头疼的不是参会&#xff0c;而是会后整理纪要。开会时既要认真听讨论、跟进工作进度&#xff0c;又要低头飞速记笔…...

RabbitMQ 入门与安装

RabbitMQ 入门与安装&#xff1a;从 MQ 概念到环境搭建 一、开篇&#xff1a;学习 RabbitMQ 前需要准备什么 RabbitMQ 属于消息中间件&#xff0c;是 Java 后端开发中非常常见的一类基础组件。学习它之前&#xff0c;最好已经具备以下基础&#xff1a; 具备一定 Java 基础&…...

用 Excel 手算一个 1-6-1 MLP:前向传播、损失、反向传播与参数更新

计算示例&#xff1a;本文用一个单输入、6 个隐藏神经元、单输出的多层感知机&#xff08;MLP&#xff09;作为例子&#xff0c;展示如何用 Excel 公式完整复现一次训练迭代。配套 Excel 文件中的“MLP计算过程”工作表已经把前向传播、损失计算、反向传播梯度和参数更新全部写…...

3步快速上手:抖音去水印批量下载器完整指南

3步快速上手&#xff1a;抖音去水印批量下载器完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批…...

B站视频下载终极指南:5步掌握免费批量下载技巧

B站视频下载终极指南&#xff1a;5步掌握免费批量下载技巧 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…...

百考通:AI一键生成期刊论文写作,全流程智能化支撑,让学术创作更高效

在学术研究领域&#xff0c;期刊论文的撰写是成果输出的关键环节&#xff0c;却也让众多科研工作者与学生倍感压力&#xff1a;选题迷茫、逻辑梳理困难、格式规范复杂、内容提炼耗时&#xff0c;严重拖慢了学术成果的发表节奏。百考通&#xff08;https://www.baikaotongai.com…...