函数递归

哈喽啊各位,真是,好久好久好久不见。这段时间实在是太过忙碌了昂,还望诸君见谅,接下来时间会松很多,咱们也会恢复正常更新速度啦

小希在这里祝诸君:期末不挂科,四六级都过!功不唐捐,玉汝于成!!!

今天昂,咱们来认识认识函数递归

一 . 什么是递归?

在我们的C语言中,“ 递归 ”是我们相当重要的一环,简而言之,递归就是——函数自己调用自己。这是一种高效解决问题的办法。

这里为诸君演示一个最简单的递归函数:

在main函数中调用main函数:

因为我们没有终止信息,程序就会一直调用,一直打印

这里代码最终会陷入死递归,导致栈溢出(Stack overflow)

在这里只是为了给诸君演示一下递归的基本形式,不是为了解决任何实际问题

二 . 递归的本质

在递归中:“ 递 ” 就是 “ 递推 ”,“ 归 ” 就是 “ 回归 ”

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

三 . 递归的限制条件

递归在书写的时候,有两个必要条件:  
(1) 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续 
(2) 每次递归调用之后越来越接近这个限制条件

 四 . 递归举例

(1)计算 n 的阶乘 n!(不考虑溢出)

注意:一个正整数的阶乘(factorial)就是所有小于等于该数的正整数的乘积,且规定0的阶乘为1

因为我们知道,n 的阶乘公式为:n!= n * (n - 1)!,如:

又因为 0 的阶乘为 1 ,则当 n == 0 时,n 的阶乘为 1 

由此我们可以得出计算时的两种情况:

那么接下来我们就可以来实现这个阶乘函数:

画图演推:

(2)按顺序打印一个整数的每一位

例如:输入1234,打印1 2 3 4 

分析:如果n是一位数,n的每一位就是n自己,n是超过1位数的话,就得拆分每一位

1234%10就能得到4,然后1234/10得到123 ,这就相当于去掉了4 ,然后继续对123%10,就得到了3,再除10去掉3,以此 类推不断的 %10 和 /10 操作 ,直到1234的每⼀位都得到

但是这样我们就会发现一个问题:我们先得到的总是最低位的数,但题目要求我们需要顺位打印,这个时候我们就可以通过递归实现,先将它 / 10,直到 / 到最前方的一位,再打印,如:

画图推演:

五 . 递归和迭代

递归是一种很好很方便的编程技巧,但是我们需要将其运用在合适的环境下,并不是每一个环境中我们使用递归都会使代码更加简便,搞不好就会弄巧成拙

就如同我们举例的第一道题目,求一个数的阶乘。还记得我们在第一个题目的后面还特别注释了:不考虑栈溢出的问题,这是因为,我们运用递归的确是可以实现求阶乘的运算,但是我们在递归的调用时,会涉及到一些运用时的开销

在C语言中每一次函数调用,都需要为本次函数调用在内存的栈区,申请一块内存空间来保存函数调 调用 期间的各种局部变量的值,这块空间被称为 运行时堆栈,或者函数栈帧
函数不返回,函数对应的栈帧空间就一直占用,所以如果 函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归 ,才逐层释放栈帧空间 所以如果采用函数递归的方式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢 出(stack overflow)的问题   

所以在这个题型下,我们最优解应该是采用迭代的方式,也就是我们常说的循环,如:

在这个题型中,我们使用迭代的方式的效率是要高于使用递归的

由此可见,我们递归虽好,但不要滥用哦,只有当一个问题非常复杂,我们难以使用迭代的方式解决问题的时候,此时使用递归的简洁性便可弥补其使用带来的运行时的开销

六 . 斐波那契数

在这里我再来举一个例子来帮助诸君理解递归与迭代

斐波那契数列是什么呢?我这里就直接为诸君搬运百度百科了昂:

简而言之呢,就是这个斐波那契数列,前两项都为 1 ,此后的每一项都等于前两项之和

求第 n 个斐波那契数:

(1)运用递归方式

斐波那契数的运算原理如下,我们可以发现,这不就是我们的递归嘛

当我们求第 n 个斐波那契数的时候,它是不适合用递归的方式来求解的,这个时候就有小伙伴要真诚地发出疑问了:这是为什么呢?明明斐波那契数本身就是通过递归的方式来运算的,我们现在用递归的方式来实现它反而不合适了呢?Good question!!!

诸君不必心急,接下来咱们就先用递归的方式来实现它,我们看看会遇到哪些问题就明白了,毕竟实践才是检验真理的唯一标准嘛

此时我们可以看到,运用递归求求第 n 个斐波那契数没有任何问题,但当我们需要运算的数字非常大时,比如50,这个效率就非常慢昂:

反正我是等了大概3分多钟,有闲心的可以自己等一等哈哈,而且还得出了一个负数,这里应该就是出现了栈溢出的问题昂

通过递归计算效率极其低下的原因是:在我们递归的运行中,会有相当大量的重复计算,且递归的层次越深,冗余计算就会越多

如图,我们要通过递归计算第50个斐波那契数,这是一个倒序的运算过程,我们先要知道第49位的数和第48位数,我们要知道这两位数我们又得先知道第48,47,47,46位,以此类推......

由此可见,我们通过递归来实现它是还会有这非常大量的冗余计算的,所以效率极其低下

(2)运用迭代方式

当我们运用迭代方式来计算效率就高得多,无需多言,咱们直接上图昂:

运用了迭代的方式,没有了冗余的计算,咱们的运算效率就高得多昂,即使是50也是秒出答案

这就是递归和迭代的区别,咱们不能滥用,得根据题目所给出的环境选择合适的方法!

OKK,有关函数递归方面的知识今天咱们就谈到这里了,许久不见,甚是想念,还望各位继续与我一同前行,话不多说,咱们下期再见,与诸君共勉!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解密:不用import,Python编程将遭遇什么?

在Python中,import 语句用于导入其他模块或库,如果不使用 import,会导致以下问题: 无法使用外部库或模块: Python标准库以及第三方库提供了丰富的功能和工具,如果不导入这些库,就无法使用它们提供的功能。 代码可读性降低: import 语句可…

新质生产力水平测算与中国经济增长新动能(dta数据及do代码)

时间跨度:2012-2022年 数据范围:全国30个省份(不含港澳台、西藏) 数据指标: 参考韩文龙等的做法,收集了全部控制变量与稳定性检验所需变量。 类型 符号 变量 变量定义 被解释变量 GDP 各省人均GDP…

螺丝工厂vtk ThreadFactory(1)

螺丝工厂vtkThreadFactory (1) 缘起 几年前的探索在Python里应用Openscad实现3D建模之3D螺纹建模初探3 新的参考: generating nice threads in openscadvtkRotationalExtrusionFilter 辅助AI: coze 笔记📒: openscad 代码分析 // 半径缩放函数,用…

llamaindex原理与应用简介(宏观理解)

llamaindex原理与应用简介(宏观理解) 文章目录 llamaindex原理与应用简介(宏观理解) 这是我认为对于 llamaindex 应用的场景概述讲的相对比较好的视频:llamaindex原理与应用简介

JPS(Jump Point Search)跳点搜索路径规划算法回顾

本篇文章主要回顾一下几年前学的JPS跳点搜索规划算法的相关内容,之前学的时候没有进行概括总结,现在补上 一、A*算法简单回顾 – 1、基本介绍和原理 A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多…

吴恩达2022机器学习专项课程C2W3:2.26 机器学习发展历程

目录 开发机器学习系统的过程开发机器学习案例1.问题描述2.创建监督学习算法3.解决问题4.小结 误差分析1.概述2.误差分析解决之前的问题3.小结 增加数据1.简述2.增加数据案例一3.增加数据案例二4.添加数据的技巧5.空白创建数据6.小结 迁移学习1.简述2.为什么迁移学习有作用3.小…

Excel文件损坏怎么修复?这2个方法要学会

当你的excel文件不可读,或者出现提示“文件已经被损坏,无法打开”,这种情况时,会给我们正常的工作带来很多麻烦,文件损坏打不开怎么办?来看看这2招,详细的图文教程,小白也能轻松恢复…

MSPM0L1306——定时器

相关配置: #include "ti_msp_dl_config.h"int main(void) {SYSCFG_DL_init();//清除定时器中断标志NVIC_ClearPendingIRQ(TIMER_0_INST_INT_IRQN);//使能定时器中断NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);while (1) { } }//定时器…

ubuntu访问windows共享文件夹

方法: Ubuntu访问Windows共享文件夹的方法-CSDN博客 基于交换机的PC端网络通信_服务器交换机pc端-CSDN博客 补充说明: 在这里面输入: smb://192.168.0.30/WindowsShareToLinux

人脸识别系统---年龄预测

一、预测年龄 1.加载预训练的人脸检测模型 face_cascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml)2.加载预训练的性别和年龄识别模型 gender_net cv2.dnn.readNetFromCaffe(deploy_gender.prototxt, gender_net.caffemodel) age_net cv2.dnn.readNet…

了解并解决 Flutter 中的灰屏问题

生产中的 flutter 应用程序中的灰屏是一种通用占位符,当框架遇到问题无法渲染预期用户界面时就会显示。是的,所以基本上是出现问题时的后备指示器。 有趣的是,这只出现在发布模式下。在任何其他模式下运行都会显示红色错误屏幕,并…

Trying to access array offset on value of type null

主要原因是版本7.4以后PHP解析器会对null类型的下标访问直接报错 背景: laravel框架 同时使用了扩展A和扩展B 扩展A要求 php>7.4,同时扩展B的对null类型的下标访问不兼容php7.4 修改扩展B不太现实,毕竟扩展B中有太多的对null类型的下标访问。 解决…

忘记word文档加密密码要如何破解word文档密码呢?

如今工作中已离不开各类办公软件,办公软件中Word几乎是天天被用到,为了保护数据,用户会为Word文档设置密码,但时间久了不记得密码了就非常麻烦。Word文档加密忘记密码怎样能打开?下面来看详细介绍吧! 一、使…

志愿服务管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,广场论坛管理,志愿活动管理,活动报名管理 前台账户功能包括:系统首页,个人中心,志愿活动&a…

YOLOv10项目-服务器上运行

1、前言 2、运行YOLOv10代码流程(超详细) (3)根据下面步骤安装: (4)数据集和其他配置 (5)测试训练(很详细) 1、前言 由于一些事情&#xff0…

PLSQL、Oracle以及客户端远程连接服务器笔记(仅供参考)

1.PLSQL参考链接: 全网最全最细的PLSQL下载、安装、配置、使用指南、问题解答,相关问题已汇总-CSDN博客文章浏览阅读2.9w次,点赞98次,收藏447次。双击之后,这里选择安装目录,你安装目录选的哪里&#xff0…

C++240617

2、升级优化自己应用程序的登录界面。 要求: 1. qss实现 2. 需要有图层的叠加 (QFrame) 3. 设置纯净窗口后,有关闭等窗口功能。 4. 如果账号密码正确,则实现…

Java图形用户界面设计的布局管理器

LayoutManager布局管理器 前言一、布局管理器的背景简介 二、FlowLayout构造方法参数说明代码演示AWTSwing 三、BorderLayout布局管理器注意点构造方法代码演示AWT示例一示例二 Swing 四、GridLayout简介构造方法代码示例AWTSwing 五、GridBagLayoutGridBagConstraints APIGrid…

Java项目常用包的分层和作用

一个好的Java项目要有好的分层,不仅简洁明了,而且降低代码的耦合度,方便维护和升级。 web层 在Java Web应用程序中,Web层通常指的是处理HTTP请求和响应的层次,它直接与客户端(通常是Web浏览器&#xff09…

【一】【QT开发应用】QT开发环境配置,安装QT应用

下载QT软件 点击网址链接,QT下载网址 下载vsaddin插件 点击网址链接,QT下载网址 根据自己的vs版本下载对应的文件. 安装QT 用命令行打开安装程序 找到直接路径, D:\Software\QT\qt-unified-windows-x86-4.3.0-1-online.exe 利用WindowsPowe…