九、函数递归

news2024/11/15 13:26:20

———————————————————————————————————————————

目录

1、递归是什么?

1.1、递归的思想

1.2、递归的限制条件

2、递归举例

2.1、举例1:求n的阶乘

2.1.1、分析和代码实现

2.2.1分析和代码实现

3、递归与迭代

3.1举例3:求第n个斐波那契数


1、递归是什么?

在C语言中,递归就是函数自己调用自己。

上面算是一个比较容易理解的一个简短的递归程序,但是一个错误的示范。

如果无限递归下去,就会出现这样的错误,栈溢出!!!

每一次函数调用,都要为这个函数调用分配内存空间(是从内存的战区上分配的,如果无限的递归调用函数,就会将栈区空间填满(使用完)),这时就出现了栈溢出的现象。

1.1、递归的思想

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

递归中的“递”就是递推的意思,“归”就是回归的意思。

1.2、递归的限制条件

递归在书写时有两个必要条件

(1)递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。

(2)每次递归调用之后越来越接近这个限制条件。

2、递归举例

2.1、举例1:求n的阶乘

一个正整数的阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1。

自然数n的阶乘写作n!

题目:计算n的阶乘(不考虑栈溢出),n的阶乘就是1~n的数字累积相乘

2.1.1、分析和代码实现

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

举例:

5!= 5*4*3*2*1

4!=4*3*2*1

--------------------

5!= 5*4!

4!= 4*3!

3!= 3*2!

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

当n==0时,n的阶乘是1,其余的阶乘都是可以通过公式计算的。

n的阶乘递归公式如下:

递归是少量的代码完成了大量复杂的运算

举例2:顺序打印一个整数的每一位

题目:输入一个整数m,按照顺序打印整数的每一位

比如:

2.2.1分析和代码实现

这个题目,放在我们面前,首先想到的是,怎么得到这个数的每一位呢?

n如果超过一位数的话,就得拆分每一位。

但是这里有个问题就是得到的数字顺序是倒着的,那既然递归能将正序变为倒序,那一定也可以将倒序改成正序。

画图理解:

3、递归与迭代

递归是一种很好的编程技巧,但很可能被误用,就像举例1一样,很容易被写成递归的形式

Fact函数是可以产生正确的结果,但是在递归函数调用的过程中涉及一些运行时的开销。

⁕在C语言中每一次函数调用,都需为本次函数调用在内存的栈区,申请一块内存空间来保存函数调用期间的各种局部变量的值,这块空间被称为运行时堆栈,或者函数栈帧。

函数不返回,函数对应的栈帧空间就一直占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间,知道函数递归不再继续,开始回归,才逐层释放栈帧空间。

所以如果采用函数递归的方式完成代码,递归层次太深就会浪费太多的栈帧空间,也可能引起栈溢出 ( stack overflow ) 的问题。

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

比如:计算n的阶乘,也是可以产生1~n的数字累计乘在一起的。 

上述代码是能够完成任务,并且效率是比递归的方式更好的。

3.1举例3:求第n个斐波那契数

如果要计算斐波那契数,是不适合使用递归求解的,但是斐波那契数的问题通过是使用递归的方式描述的,如下:

斐波那契数列:

有很多重复运算。

用递归方式解决问题:

该类问题不适合使用递归的方式解决,所以换一种思路,使用迭代的方式。

代码如下:

有时候,递归虽好,但是也会引入一些问题,所以我们使用递归时,适可而止就好。

拓展学习:

(1)青蛙跳台阶问题

本质:斐波那契数列问题

一次能跳一个台阶或两个台阶,问这只青蛙跳上n个台阶有多少种跳法?

(2)汉诺塔问题

借助于B,将A上的盘子挪到C上

挪的过程中,盘子一定是上小,下大

以上两个问题都可以使用递归很好的解决。

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

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

相关文章

百度智能云将大模型引入网络故障定位的智能运维实践

物理网络中,某个设备发生故障,可能会引起一系列指标异常的告警。如何在短时间内从这些告警信息中找到真正的故障原因,犹如大海捞针,对于运维团队是一件很有挑战的事情。 在长期的物理网络运维工作建设中,百度智能云通…

文献阅读(1)——深度强化学习求解车辆路径问题的研究综述

doi: 10.3778/j.issn.1002-8331.2210-0153 深度强化学习求解车辆路径问题的研究综述 (ceaj.org) 组合最优化问题( combinatorial optimization problem, COP ) 日常生活中常见的 COP 问题有旅行商问题(traveling sale…

碾压SOTA!最新视觉SLAM:渲染速度提升176倍,内存占用减少150%

视觉SLAM,一种结合了CV与机器人技术的先进方法。与激光SLAM相比,它成本低廉且信息量大,易于安装,拥有更优秀的场景识别能力,因此在自动驾驶等许多场景上都非常适用,是学术界与工业界共同关注的热门研究方向…

【从零开始实现stm32无刷电机FOC】【理论】【3/6 位置、速度、电流控制】

目录 PID控制滤波单独位置控制单独速度控制单独电流控制位置-速度-电流串级控制 上一节,通过对SVPWM的推导,我们获得了控制电机转子任意受力的能力。本节,我们选用上节得到的转子dq轴解耦的SVPWM形式,对转子受力进行合理控制&…

C++——map和set类用法指南

一、前言 1.1 关联式容器 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key,value>结构的键值对&#xff0c;在数据检索时比序列式容器效率更高。 1.2 键值对 用来表示具有一一对应关系的一种结构&#xff0c;该结构中一般…

ARM功耗管理标准接口之PSCI

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理有哪些标准接口&#xff1f;ACPI&PSCI&SCMI&#xff1f; Advanced Configuration and Power Interface Power State Coordination Interface System Control and Management Interface ARM V8架构的软件分…

组件设计原则和度量方法

在日常开发过程中&#xff0c;Spring、Dubbo、Mybatis等都是我们常用的开源框架。当你在使用这些框架时&#xff0c;不可避免需要通过分析源码来理解内部的实现原理。那么&#xff0c;你在翻阅源代码时&#xff0c;有没有想过这些框架的代码结构为什么要这样进行设计和实现呢&a…

自学鸿蒙HarmonyOS的ArkTS语言<五>attributeModifier动态属性和用attributeModifier封装公共组件

【官方文档传送门】 一、抽取组件样式 class MyModifier implements AttributeModifier<ButtonAttribute> {applyNormalAttribute(instance: ButtonAttribute): void {instance.backgroundColor(Color.Black)instance.width(200)instance.height(50)instance.margin(10…

2008年上半年软件设计师【下午题】真题及答案

文章目录 2008年上半年软件设计师下午题--真题2008年上半年软件设计师下午题--答案 2008年上半年软件设计师下午题–真题 2008年上半年软件设计师下午题–答案

数字滚动动画~

前言 数字从0.00滚动到某个数值的动画 实现&#xff08;React版本&#xff09; Dom <div className"number" ref{numberRef}>0.00</div> JS const _initNumber () > {const targetNumber 15454547.69;const duration 1500;const numberElement…

[leetcode]subarray-product-less-than-k 乘积小于K的子数组

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {if (k 0) {return 0;}int n nums.size();vector<double> logPrefix(n 1);for (int i 0; i < n; i) {logPrefix[i 1] …

E. Beautiful Array(cf954div3)

题意&#xff1a;给定一个数组&#xff0c;可以先对数组进行任意排序&#xff0c;每次操作可以选择一个ai&#xff0c;将它变成aik&#xff0c; 想让这个数组变成一个美丽数组&#xff08;回文数组&#xff09;&#xff0c;求最少操作次数 分析&#xff1a; 先找出相同的数字…

Android liveData 监听异常,fragment可见时才收到回调记录

背景&#xff1a;在app的fragment不可见的情况下使用&#xff0c;发现注册了&#xff0c;但是没有回调导致数据一直未更新&#xff0c;只有在fragment可见的时候才收到回调 // 观察通用信息mLightNaviTopViewModel.getUpdateCommonInfo().observe(this, new Observer<Common…

常用的JVM启动参数

JVM的启动参数有很多&#xff0c;但是我们平常能用上的并不是特别多&#xff0c;这里介绍几个我们常用的&#xff1a; 1. 堆设置&#xff1a; 。 -Xms&#xff1a;设置堆的初始大小。 。.-Xmx&#xff1a;设置堆的最大大小。 2. 栈设置&#xff1a; 。 -XsS&#xff1a;设置每个…

国产大模型第一梯队玩家,为什么pick了CPU?

AI一天&#xff0c;人间一年。 现在不论是大模型本身&#xff0c;亦或是AI应用的更新速度简直令人直呼跟不上—— Sora、Suno、Udio、Luma……重磅应用一个接一个问世。 也正如来自InfoQ的调查数据显示的那般&#xff0c;虽然AIGC目前还处于起步阶段&#xff0c;但市场规模已…

没想到吧,Python print函数也能玩出花!

目录 1、基础打印技巧&#x1f680; 1.1 print()函数入门 1.2 格式化字符串输出 使用f-string 使用str.format() 2、高级格式化选项&#x1f3a8; 2.1 f-string动态插入变量 2.2 使用format方法 3、控制台颜色输出&#x1f308; 3.1 利用ANSI转义码 3.2 使用第三方库…

结束休刊博客真·vlog | 顺便说一下500粉的事

啊&#xff0c;首先是信 ♥亲爱的读者们&#xff0c; 在这个充满数字韵律与代码奇迹的时空里&#xff0c;我满怀激动与感激的心情&#xff0c;提笔写下这封信&#xff0c;宣布一个令人振奋的消息——经过一段时间的休整与充电&#xff0c;我终于要结束这段宝贵的休刊时光&…

Errno2:No such file or directory,在当前文件确实没有该图片,怎么解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

测试和使用Pogo-DroneCAN CANUART串口扩展模块

关键词&#xff1a;Ardupilot&#xff0c;Pixhawk&#xff0c;DroneCAN&#xff0c;CANUART&#xff0c;Serial over DroneCAN&#xff0c;DroneCANUART&#xff0c;UAVCAN&#xff0c;MAVlink&#xff0c;Px4 Keywords&#xff1a;Ardupilot&#xff0c;Pixhawk&#xff0c;D…

c语言数据结构--图综合应用实验——校院导航

实验内容&#xff1a; 面向学校&#xff0c;构建一个校院导游软件。用无向图表示所在学校的校院景点平面图&#xff0c;图中顶点表示主要景点&#xff0c;存放景点的编号、名称、简介等信息&#xff0c;图中边表示景点之间的道路&#xff0c;存放路径距离等信息。该软件具有以…