【C语言复习专题】函数调用

【C语言复习专题】函数调用

  • 1.递归是什么?
    • 1.1递归的思想:
    • 1.2递归的限制条件
  • 2.递归举例
    • 2.1eg1:求n的阶乘
      • 2.1.1 分析和代码实现
      • 2.1.2作图演示过程
    • 2.2 eg2:顺序打印一个整数的每一位
      • 2.2.1分析
  • 3.递归与迭代

在这里插入图片描述

1.递归是什么?

递归是学习C语言函数绕不开的一个话题,那什么是递归呢?
递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。
写一个史上最简单的C语言递归代码:

在这里插入图片描述
在这里插入图片描述
.上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不是为了解决问题,代码最终也会陷入死递归,导致栈溢出(Stack overflow)。
在这里插入图片描述

1.1递归的思想:

把一个大型复杂问题层层转化为一个与原问题相似,但规模较小的子问题来求解;直到子问题不能再
被拆分,递归就结束了。所以递归的思考方式就是把大事化小的过程。
递归中的递就是递推的意思,归就是回归的意思,接下来慢慢来体会。

1.2递归的限制条件

递归在书写的时候,有2个必要条件:

●递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
●每次递归调用之后越来越接近这个限制条件。
在下面的例子中,我们逐步体会这2个限制条件。

2.递归举例

2.1eg1:求n的阶乘

一个正整数的阶乘(factorial) 是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。
题目:计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。

2.1.1 分析和代码实现

我们知道n的阶乘的公式: n! = n*(n- 1)!
在这里插入图片描述

这样的思路就是把一个较大的问题, 转换为一个与原问题相似,但规模较小的问题来求解的。

当 n==0 的时候,n的阶乘是1,
其余n的阶乘都是可以通过公式计算。
n的阶乘的递归公式如下:

在这里插入图片描述
那我们就可以写出函数Fact求n的阶乘,假设Fact(n) 就是求n的阶乘,那么Fact(n-1)就是求n-1的阶乘,函数如下:
在这里插入图片描述

2.1.2作图演示过程

在这里插入图片描述

2.2 eg2:顺序打印一个整数的每一位

输入一个整数m,打印这个按照顺序打印整数的每一位。
比如:
输入: 1234
输出: 1 2 3 4
输入: 520
输出: 5 2 0

2.2.1分析

这个题目,放在我们面前,首先想到的是,怎么得到这个数的每一-位呢?
如果n是一位数,n的每一位就是n自己
n是超过1位数的话,就得拆分每一位

1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4
然后继续对123%10,就得到了3,再除10去掉3,以此类推
不断的%10和/10操作,直到1234的每一位都得到;
但是这里有个问题就是得到的数字顺序是倒着的
我们有了灵感,我们发现其实一个数字的最低位是最容易得到的,通过%10就能得到
那我们假设想写一个函数Print来打印n的每一位,如下表示:

在这里插入图片描述

在这个解题的过程中,我们就是使用了大事化小的思路
把Print(1234)打印1234每一位,拆解为首先Print(123)打印123的每-位,再打印得到的4
把Print(123)打印123每一位,拆解为首先Print(12)打印12的每一位,再打印得到的3
直到Print打印的是一位数,直接打印就行。

在这里插入图片描述

3.递归与迭代

递归是一-种很好的编程技巧,但是很多技巧- -样,也是可能被误用的,就像前面举例一样,看到推导的公式,很容易就被写成递归的形式:

在这里插入图片描述
在这里插入图片描述

Fact函数是可以产生正确的结果,但是在递归函数调用的过程中涉及一些运行时的开销。
在C语言中每一次函数调用,都要需要为本次函数调用在栈区申请- -块内存空间来保存函数调用期间
的各种局部变量的值,这块空间被称为运行时堆栈,或者函数栈帧。
函数不返回,函数对应的栈帧空间就一直占用,所以如果函数调用中存在递归调用的话,每一次递归
函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。
所以如果采用函数递归的方式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢
出(stack overflow) 的问题。
注:关于函数栈帧的详细内容,鹏哥录制了视频专门讲解的,下课导入课程,自行学习。

所以如果不想使用递归就得想其他的办法,通常就是迭代的方式(通常就是循环的方式)。

在这里插入图片描述
事实上,我们看到的许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更加清晰,
但是这些问题的迭代实现往往比递归实现效率更高。
当一个问题非常复杂,难以使用迭代的方式实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。

举例3:求第n个斐波那契数列
我们也能举出更加极端的例子,就像计算第n个斐波那契数,是不适合使用递归求解的,但是斐波那契数的问题通过是使用递归的形式描述的,如下:
在这里插入图片描述

在这里插入图片描述
当我们n输入为50的时候,需要很长时间才能算出结果,这个计算所花费的时间,是我们很难接受的,这也说明递归的写法是非常低效的,那是为什么呢?
在这里插入图片描述
其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计
算,而且递归层次越深,冗余计算就会越多。我们可以进行测试:
在这里插入图片描述
这里我们看到了,在计算第40个斐波那契数的时候,使用递归方式,第3个斐波那契数就被重复计算了39088169次,这些计算是非常冗余的。所以斐波那契数的计算,使用递归是非常不明智的,我们就得想迭代的方式解决。
我们知道斐波那契数的前2个数都1,然后前2个数相加就是第3个数,那么我们从前往后,从小到大计算就行了。

在这里插入图片描述

这样避免了许多重复计算,代码运行效率也会提高很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2-124 基于matlab得结构稀疏字典实现SAR图像低秩重建

基于matlab得结构稀疏字典实现SAR图像低秩重建,通过K-SVD和W-KSVD结合OMP进行重建。K-SVD算法是一种字典学习算法,能够对字典进行优化,使其能够更好地表示训练样本集。W-KSVD算法是K-SVD算法的扩展,它能够利用权重信息对字典进行优…

华为---Super VLAN简介及示例配置

目录 1. Super VLAN技术产生背景 2. Super VLAN概念 3. Super VLAN应用场景 4. Super VLAN工作原理 5. Super-VLAN主要配置命令 6. Super-VLAN主要配置步骤 7. 示例配置 7.1 示例场景 7.2 网络拓扑 7.3 配置代码 7.4 代码解析 7.5 测试验证 1. Super VLAN技术产生背…

【开源免费】基于SpringBoot+Vue.JS房屋租赁系统(JAVA毕业设计)

本文项目编号 T 020 ,文末自助获取源码 \color{red}{T020,文末自助获取源码} T020,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

ubuntu20.4环境下gcc-aarch64交叉编译器的安装

交叉编译器(Linux环境)arm gcc 8.3一共有5个版本,常用的有4个版本(另外一个为大端linux版本),分别是32bit裸机版本(arm-eabi)、64bit裸机版本(aarch64-elf)、…

2015年-2016年 软件工程程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析

文章目录 2015年1.c语言程序设计部分2.数据结构程序设计部分 2016年1.c语言程序设计部分2.数据结构程序设计部分 2015年 1.c语言程序设计部分 1.从一组数据中选择最大的和最小的输出。 void print_maxandmin(double a[],int length) //在一组数据中选择最大的或者最小的输出…

EM算法学习

1.EM算法的介绍 可以发现:计算出θA和θB的值的前提是知道A、B币种的抛掷情况。 所以我们需要使用EM算法:求出每轮选择硬币种类的概率 2.EM算法执行过程: 第一步:首先初始化设置一组PA和PB证明的值。然后通过最大似然估计得到每…

2024软考网络工程师笔记 - 第3章.广域通信网

文章目录 广域网物理层特性1️⃣公共交换电话网 PSTN2️⃣本地回路3️⃣机械特性4️⃣电气特性 🕑流量与差错控制1️⃣流量与差错控制2️⃣流量控制——亭等协议3️⃣流控机制——滑动窗口协议4️⃣差错控制5️⃣差错控制——停等协议6️⃣差错控制——选择重发ARQ协…

MySQL【知识改变命运】08

数据库约束 1:约束的几个类型2:NOT NULL非空约束3:UNIQUE 唯⼀约束4:PRIMARY KEY 主键约束4.1:回顾 5:FOREIGN KEY 外键约束5.1:创建班级表(主表),并初始化数据5.2:重构学⽣表(从表)…

【Golang】Go语言http编程底层逻辑实现原理与实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Docker 拉取镜像时配置可用镜像源(包含国内可用镜像源)

文章目录 写在前面一、Docker 官方源二、更换Docker 国内可用镜像源 (推荐使用)参考链接 写在前面 自己的测试环境: Ubuntu20.04,docker-27.3.1 一、Docker 官方源 打开 /etc/docker/daemon.json文件: sudo gedit …

STM32F4- SD卡和 FATFS文件系统

单片机系统常需大容量存储设备,如U盘、FLASH芯片、SD卡等。 其中,SD卡因容量大、支持SPI/SDIO驱动、尺寸多样,成为单片机系统的优选。 STM32F4开发板自带SD卡接口,使用SDIO接口驱动,支持高速数据传输。 1.1 SDIO 简介…

JavaWeb学习(1)

目录 一、什么是JavaWeb 二、静态web和动态web 三、Web服务器(Tomcat) 四、Http 4.1 是什么 4.2 两个时代 4.3 Http请求 4.4 Http响应 五、Maven 六、Servlet 七、HttpServletResponse 7.1 常见应用 7.1.1 向浏览器输出消息 7.1.2 下载文件 …

为您的人工智能数据提供类似 Git 的版本管理功能

您过去肯定有过版本控制代码。但是,您是否对数据进行了版本控制?您是否曾经想过与不同的团队协作处理大量数据,而无需提交大量数据?想象一下,使用类似 git 的命令来运行类似存储库的生态系统,在该生态系统中…

Unity实现自定义图集(三)

以下内容是根据Unity 2020.1.0f1版本进行编写的   1、实现编辑器模式下进游戏前Pack全部自定义图集 同Unity的图集一样,Unity的编辑器模式会在进游戏前把全部的SpriteAtlas都打一次图集,如图: 我们也实现这样的效果。 首先需要获取全部的图集路径。因为目前使用的是以.…

RISC-V笔记——RVWMO基本体

1. 前言 RISC-V使用的内存模型是RVWMO(RISC-V Weak Memory Ordering),它是Release Consistency的扩展,因此,RVWMO的基本特性类似于RC模型。 2. RC模型 Release consistency(RC)的提出是基于一个观察:将所有同步操作用FENCE围在一…

全国职业技能大赛——信息安全管理与评估第一阶段BC、FW、WAF题目详细解析过程

💗需要职业技能大赛环境+WP,请联系我!🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 一个想当文人的黑客 ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【edusrc漏洞挖掘】 【VulnHub靶场复现】【面试分析】 🎉欢迎关注💗一起学习👍一起讨论⭐️一起…

【WPF】中ListBox的ListBox选项的选中状态在弹出MessageBox后失效的解决办法

1.问题描述 1.1 ListBox选项的样式 在WPF中,可以通过定义ListBoxItem的样式来改变ListBox选项的选中状态。这通常涉及到使用ControlTemplate和Trigger来指定当ListBoxItem处于不同状态时(如被选中、鼠标悬停等)的外观。ListBoxItem设置不同…

TikTok零播放的原因及解决方法

TikTok作为一个月活跃用户数已经超过15亿的社媒平台,巨大的流量不断吸引着用户加入,其中不乏需要推广获客的卖家。在运营推广工作中,视频播放量是重要的评估维度,如果出现零播放的情况,需要卖家找出原因并尽快解决。 一…

『Mysql集群』Mysql高可用集群之主从复制 (一)

Mysql主从复制模式 主从复制有一主一从、主主复制、一主多从、多主一从等多种模式. 我们可以根据它们的优缺点选择适合自身企业情况的主从复制模式进行搭建 . 一主一从 主主复制 (互为主从模式): 实现Mysql多活部署 一主多从: 提高整个集群的读能力 多主一从: 提高整个集群的…

vulnhub靶场之digitalworld.local: MERCY v2

一.环境搭建 1.靶场描述 MERCY is a machine dedicated to Offensive Security for the PWK course, and to a great friend of mine who was there to share my sufferance with me. :-) MERCY is a name-play on some aspects of the PWK course. It is NOT a hint for the …