函数递归知识
函数递归知识文章目录函数递归知识一.什么是递归一递归的思想二递归的限制条件二.递归举例一举例1求n的阶乘1.分析和代码实现2.画图推演二举例2顺序打印一个整数的每一位1.分析和代码实现2.画图推演三.递归与迭代一递归的缺陷二举例求第n个斐波那契数1.递归方式2.迭代方式一.什么是递归递归其实是一种解决问题的方法在C语言中递归就是函数自己调用自己。最简单的C语言递归代码#includestdio.hintmain(){printf(hehe\n);main();//main函数中⼜调⽤了main函数return0;}上面的递归只是为了演示递归的基本形式代码最终也会陷入死递归导致栈溢出Stack overflow。一递归的思想递归就是递推回归的意思。把⼀个大型复杂问题层层转化为一个与原问题相似但规模较小的子问题来求解直到子问题不能再被拆分递归就结束了。所以递归的思考方式就是把大事化小的过程。二递归的限制条件递归在书写的时候有2个必要条件递归存在限制条件当满足这个限制条件的时候递归便不再继续。每次递归调用之后越来越接近这个限制条件。二.递归举例一举例1求n的阶乘一个正整数的阶乘factorial是所有小于及等于该数的正整数的积并且0的阶乘为1自然数n的阶乘写作 n!。题目计算n的阶乘不考虑溢出n的阶乘就是1~n的数字累积相乘。1.分析和代码实现n的阶乘的公式 n n * (n − 1)!n的阶乘和n-1的阶乘是相似的问题但是规模要少了n。有一种有特殊情况是当 n0 的时候n的阶乘是1而其余n的阶乘都是可以通过上面的公式计算。写出 n 的阶乘的递归公式如下假设Fact(n)就是求n的阶乘那么Fact(n-1)就是求n-1的阶乘函数如下intFact(intn){if(n0){return1;}else{returnn*Fact(n-1);}}运行测试不考虑n太大的情况n太大存在溢出2.画图推演该递归限制条件是n0每次递推n-1越来越接近这个限制条件当满足这个限制条件的时候递推便不再继续开始回归。二举例2顺序打印一个整数的每一位输入一个整数m按照顺序打印整数的每一位。比如输入1234 输出1 2 3 41.分析和代码实现关于这个题目首先想到的是怎么得到这个数的每一位。如果n是一位数就是n自己n超过1位数就得拆分每一位。1234%10就能得到4然后1234/10得到123这就相当于去掉了4 然后继续对123%10就得到了3再除10去掉3以此类推不断的 %10 和 /10 操作直到1234的每一位都得到。但是有个问题就是得到的数字顺序是倒着的。假设想写一个函数Print来打印n的每一位Print(1234)//打印1234的每⼀位其中1234中的4可以通过%10得到那么Print(1234)就可以拆分为两步Print(1234/10)//打印123的每一位printf(%d ,1234%10)//打印4Print(1234)打印1234每一位拆解为先Print(123)打印123的每一位再打印得到的4。Print(123)打印123每一位拆解为先Print(12)打印12的每一位再打印得到的3。直到Print打印的是一位数直接打印就行。函数如下voidPrint(size_tn)//打印n的每一位{if(n9){Print(n/10);}printf(%zu ,n%10);}运行测试2.画图推演该递归限制条件是n为个位数n9)每次递推n/10越来越接近这个限制条件当满足这个限制条件的时候递推便不再继续开始回归,逐个打印。三.递归与迭代一递归的缺陷递归是一种很好的编程技巧但是可能被误用就像举例1一样看到推导的公式很容易就被写成递归的形式intFact(intn){if(n0){return1;}else{returnn*Fact(n-1);}}Fact函数可以产生正确的结果但是在递归函数调用的过程中涉及一些运行时的开销。在C语言中每一次函数调用都需要在内存的栈区申请一块内存空间用于保存函数调用期间的各种局部变量的值这块空间被称为运行时堆栈或者函数栈帧。函数不返回函数对应的栈帧空间就一直占用所以如果函数调用中存在递归调用每一次递归函数调用都会开辟属于自己的栈帧空间直到函数递归不再继续开始回归才逐层释放栈帧空间。如果采用函数递归的方式完成代码递归层次太深就会浪费太多的栈帧空间也可能引起栈溢出stack overflow的问题。如果不想使用递归通常就是迭代循环的方式。例如计算 n 的阶乘可以产生1~n的数字累计乘在⼀起的。许多问题是以递归的形式进行解释的这只是因为它比非递归的形式更加清晰但是这些问题的迭代实现往往比递归实现效率更高。当一个问题非常复杂难以使用迭代的方式实现时此时递归实现的简洁性便可以补偿它所带来的运行时开销。二举例求第n个斐波那契数1.递归方式计算第n个斐波那契数是不适合使用递归求解的但是斐波那契数的问题通过是使用递归的形式描述的如下看到这公式很容易诱导我们将代码写成递归的形式intFib(intn){if(n2){return1;}else{returnFib(n-1)Fib(n-2);}}运行测试当n输入为50的时候需要很长时间才能算出结果这也说明递归的写法是非常低效的。原因递归程序会不断的展开在展开的过程中在递归的过程中会有重复计算而且递归层次越深冗余计算就会越多。代码测试在计算第30个斐波那契数的时候使用递归方式光是第3个斐波那契数就被重复计算了317811次这些计算是非常冗余的。2.迭代方式斐波那契数的前2个数都为1然后前2个数相加就是第3个数从前往后从小到大计算就行了。#includestdio.hintFib(intn){inta1,b1,c1;while(n2)//不知循环次数用while循环n2时不用计算直接返回1所以c初始化1{cab;ab;bc;n--;}returnc;}

相关新闻

数据库课程设计模板:学生成绩管理系统表结构与SQL实战

数据库课程设计模板:学生成绩管理系统表结构与SQL实战

简介:这份资源是面向高校数据库课程设计场景的学生成绩管理系统模板文档,适合正在完成数据库课设、需要参考完整设计流程与报告结构的本科生或自学者。文档以Microsoft SQL Server 2000为设计环境,围绕需求分析、概念模型、逻辑与物理结构设计…

2026/10/9 7:55:24 阅读更多 →
米哈游笔试备考全解析:题型拆解、岗位策略与复盘方法

米哈游笔试备考全解析:题型拆解、岗位策略与复盘方法

看到这份标题的人,大概率正在为米哈游的笔试做准备。先说和很多人预期不太一样的一件事:这类“笔试真题”帖子,题目本身能提供的价值很低。不是因为题目难搞到,而是米哈游校招笔试题通常按岗位和场次分开,题目类型可以…

2026/10/9 7:55:24 阅读更多 →
BFS求最短路:从队列原理到隐式图状态转移实战

BFS求最短路:从队列原理到隐式图状态转移实战

1. 为什么BFS能求最短路:从队列到层次遍历的直觉1.1 边权为1时的最短路径就是“最少步数”先聊一个很多教程不会直说的核心点:BFS能求最短路,不是因为它“知道”最短,而是因为它的遍历顺序天然保证了“先到达的路径一定是最短路径…

2026/10/9 7:55:24 阅读更多 →

最新新闻

虚拟机创建全指南:从选型、装系统到网络配置与报错排查

虚拟机创建全指南:从选型、装系统到网络配置与报错排查

装虚拟机这件事,乍一看就是个"向导里点下一步"的活,但真正把虚拟机创建出来、装好系统、配好网络、用顺手的人,其实并不多。这些年我帮同事、朋友处理过的虚拟机问题,从"安装 Linux 蓝屏"到"VMware 无法…

2026/10/9 8:22:05 阅读更多 →
Spring Boot医疗挂号系统号源一致性实战

Spring Boot医疗挂号系统号源一致性实战

简介:本资源是一套完整的医院门诊在线预约挂号管理系统毕业设计项目,面向计算机专业本科生及Java初学者,解决传统线下挂号流程繁琐、效率低下的实际问题,适用于课程设计、毕设开发与SSM框架实战学习。压缩包含640个文件&#xff0…

2026/10/9 8:22:05 阅读更多 →
基于Java的毕业选题系统:技术选型、数据库设计与部署避坑

基于Java的毕业选题系统:技术选型、数据库设计与部署避坑

简介:基于Java/JSP实现的毕业选题系统源码包,面向高校毕业设计、课程设计及Java Web学习者。系统覆盖管理员、教师、学生三类角色:管理员能维护系主任信息并负责系统日常运行,教师可录入毕业设计题目、审核学生选题,学…

2026/10/9 8:22:05 阅读更多 →
OPNET中AODV路由表进程aodv_rte.pr解析与仿真调试指南

OPNET中AODV路由表进程aodv_rte.pr解析与仿真调试指南

简介:AODV路由协议是无线自组织网络中典型的按需距离矢量协议,这份源码包可配合OPNET仿真平台使用,面向高校网络专业学生、科研人员及路由协议开发者,解决AODV协议实现与仿真验证问题。压缩包包含1个C语言源文件,文件大…

2026/10/9 8:22:05 阅读更多 →
加密货币免费行情数据源选型与避坑指南

加密货币免费行情数据源选型与避坑指南

1. 免费行情数据不是没有,而是太散:先搞清楚要解决什么问题 做量化也好,做个人监控面板也好,第一步永远绕不开数据。我见过不少朋友上来就急着写策略,结果被最基础的“加密货币历史数据和实时行情接口怎么免费搞”这个…

2026/10/9 8:22:05 阅读更多 →
用Go实现自定义Sidecar:服务网格动态流量治理与熔断实战

用Go实现自定义Sidecar:服务网格动态流量治理与熔断实战

1. 服务网格动态流量治理的切入点:为什么用Go语言做Sidecar扩展 做服务网格的老哥应该都有同感,Istio、Linkerd这些框架看多了,各种概念满天飞,但真到自己动手做一套“动态流量治理”方案时,能沉淀下来的落地细节其实并…

2026/10/9 8:21:03 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →