c语言基础知识帮助理解(函数递归详解)

news2025/1/13 17:27:36

"从前有座山,山里有座庙,庙里有个老和尚和一个小和尚。有一天老和尚对小和尚说:“从前有座山.山里有座庙,庙里有个老和尚和一个小和尚,有一天老和尚对小和尚说:“从前有座山.山里有座庙,庙里有个老和尚和一个小和尚......" (虽能体现递归特点,但又不是递归)


目录

1.什么是递归

2.递归的两个必要条件

 3.事例和讲解

 4.递归原理讲解

 5.递归弊端

5.1利用计算斐波那契数列来引入

5.2如何改进 


1.什么是递归

当一个函数在其定义中调用自身的过程称为递归。递归是一种强大的编程技巧,可以解决许多问题,特别是那些可以被分解为相同问题的子问题的情况

递归的主要思考方式在于:把大事化小

在C语言中,函数递归的基本原理是将一个大问题分解为一个或多个更小的问题,然后通过调用自身来解决这些更小的问题,直到达到基本情况,即不再需要递归调用的情况 


2.递归的两个必要条件

  • 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
  • 每次递归调用之后越来越接近这个限制条件。

试想如若没有限制条件,那便无限循环,真就成了上面的“从前有座山 山里有座庙” 的故事了。


 3.事例和讲解

用递归来实现求n的阶乘(factorial) :

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int factorial(int n)
{
	if (n > 1)//递归终止的条件
	{
		return n * factorial(n - 1);
	}
	else
	{
		return 1;
	}
}

int main()//递归实现求n的阶乘
{
	int n = 0;
	scanf("%d", &n);
	int n_factorial = factorial(n);
	printf("%d", n_factorial);
	return 0;
}

下面是一个示例的递归树,用于说明计算4的阶乘的过程:

4! = 4 * 3!

|

3! = 3 * 2!

|

2! = 2 * 1!

|

1! = 1

下面讲解一下思路:

  • 最基本便是:n!=n*(n-1)!——让我们有了返回n * factorial(n - 1)的想法
  • 当n=1时,便是终止条件——返回1 ,使用factorial(n - 1)也是为了更加靠近n=1的终止条件

 4.递归原理讲解

当一个函数被调用时,会在内存中分配一个称为函数栈帧(Function Stack Frame)的数据结构。函数栈帧用于存储函数的局部变量、函数的参数、函数的返回地址等信息。

下面是一个示意图,展示了函数栈帧的结构:

  •  Return Address:保存着函数调用结束后需要返回的地址,即函数调用的下一条指令的地址。当函数执行完毕后,CPU会根据该地址跳转到正确的位置继续执行
  • Previous Stack Frame:指向调用函数的函数栈帧的地址,用于在函数返回时恢复调用函数的上下文
  • Local Variables:存储函数的局部变量。每个函数栈帧都有自己的一块内存空间,用于存储局部变量的值
  • Parameters:存储函数的参数。参数在函数调用时被传递给函数,并存储在函数栈帧中

在递归函数中,每次递归调用都会生成一个新的函数栈帧,这些函数栈帧会按照一定的顺序依次排列在内存中:先调用的函数先进入栈中,后销毁

 


 5.递归弊端

5.1利用计算斐波那契数列来引入

int Fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}

int main()
{
	int n = 3;
	printf("第三个斐波那契数%d\n", Fib(n));

	int x = 50;
	printf("第五十个斐波那契数%d", Fib(x));
	return 0;
}

 我们会发现,第三个斐波纳契数立马就出来了,而第五十个迟迟不出来。

这就暴露了问题:

  • 这个函数的时候如果我们要计算第 50 个斐波那契数字的时候特别耗费时间
  • 函数求 10000 的阶乘(不考虑结果的正确性),程序会崩溃(我已经为各位试过了,不要再试了),也就是栈溢出了

这也说明:有时递归的效率不是很高 ,而且不得不说有时递归代码的可读性是不及循环的

5.2如何改进 

 那我们如何改进呢?

  • 将递归改写成非递归。
  • 使用static对象替代 nonstatic 局部对象。在递归函数设计中,可以使用 static 对象替代nonstatic 局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放 nonstatic 对象的开销,而且 static 对象还可以保存递归调用的中间状态,并且可为各个调用层所访问

下面便用循环来改写求斐波那契数列:

int Fib(int n)
{
	int n1 = 1;
	int n2 = 1;
	int result = 0;
	while (n > 2)
	{n--;
		result = n1 + n2;
		n1 = n2;
		n2 = result;
		
	}
	return result;
}

int main()
{
	int n = 3;
	printf("第三个斐波那契数%d\n", Fib(n));

	int x = 30;
	printf("第三十个斐波那契数%d", Fib(x));
	return 0;
}

所以我们也不要一味地去使用递归在合适的代码里使用合适的方法才能让我们的编程水平更加出色。 


总之,递归是一项强大的编程技术,但在使用时需要注意栈溢出问题。通过合理的算法设计和对函数栈帧的了解,我们可以更好地应对递归问题,使代码更加健壮和可靠

这次的分享先到这里的,感谢大家的支持,下一次会总结数组相关的知识!!! 

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

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

相关文章

uniapp返回

// 监听返回事件onNavigationBarButtonTap() {uni.showModal({title: 提示,content: 确定要返回吗&#xff1f;,success: (res) > {if (res.confirm) {uni.navigateBack({delta: 2})}}})},

Palo Alto Networks® PA-220R 下一代防火墙 确保恶劣工况下的网络安全

一、主要安全功能 1、每时每刻在各端口对全部应用进行分类 • 将 App-ID 用于工业协议和应用&#xff0c;例如 Modbus、 DNP3、IEC 60870-5-104、Siemens S7、OSIsoft PI 等。 • 不论采用何种端口、SSL/SSH 加密或者其他规避技术&#xff0c;都会识别应用。 • 使用…

opencv-34 图像平滑处理-2D 卷积 cv2.filter2D()

2D卷积是一种图像处理和计算机视觉中常用的操作&#xff0c;用于在图像上应用滤波器或卷积核&#xff0c;从而对图像进行特征提取、平滑处理或边缘检测等操作。 在2D卷积中&#xff0c;图像和卷积核都是二维的矩阵或数组。卷积操作将卷积核在图像上滑动&#xff0c;对每个局部区…

智慧消防解决方案

智慧消防解决方案引入了物联网云平台、云计算中心等创新技术&#xff0c;实现对消防物联网数据的实时采集、传输和分析处理。通过智能感知设备与云平台的紧密结合&#xff0c;该解决方案利用先进的物联网技术、移动互联网和云计算等先进技术手段&#xff0c;实现火灾报警信号的…

健身用什么耳机好、健身大神都戴的运动耳机推荐

随着健身逐渐成为一种普遍的生活状态&#xff0c;越来越多的运动者选择将音乐作为他们锻炼时的精神伴侣。一款好的运动耳机&#xff0c;佩戴的舒适性再到音质、续航、防水。大家肯定问到哪有什么运动耳机好用的呢&#xff1f;今天就为大家推荐几款合适的运动耳机 1、NANK南卡R…

差分隐私 MP-SPDZ框架安装

ubuntu虚拟机安装MP-SPDZ框架 1.下载安装包到虚拟机内 https://github.com/data61/MP-SPDZ/releases 安装git 报错Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 4402(unattended-upgr) 解决方案 #杀死进程 sudo k…

重磅!三思LED显示闪耀第31届世界大运会五座赛事场馆

成都第31届世界大学生夏季运动会 2023中国成都。 世界大学生夏季运动会&#xff08;以下简称“大运会”&#xff09; 我们来了&#xff01; 三思LED不仅以颇具想象力的艺术手法 亮相这场高规格体育盛会 更以卓越品质为此盛大赛事保驾护航&#xff01; 揭秘|成都大运会会…

2023年电赛---运动目标控制与自动追踪系统(E题)关于网友的问题回复

前言 &#xff08;1&#xff09;各位私信问问题之前&#xff0c;看看自己的问题是不是在这个里面再问&#xff01; &#xff08;2&#xff09; <1>2023年8月3日&#xff0c;10点25分。增加第三问的细节回答。 <2>2023年8月3日&#xff0c;10点45分。更新关于舵机安…

HTML中元素和标签有什么区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 标签&#xff08;Tag&#xff09;⭐元素&#xff08;Element&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

使用爬虫代理IP速度慢是什么原因?

你们有没有遇到过使用爬虫代理IP速度慢的问题呢&#xff1f;相信很多使用爬虫抓取的人都曾经陷入过这个烦恼&#xff0c;今天我们就来聊聊这个话题。 首先&#xff0c;我们得明白为什么爬虫代理IP速度会变得慢。其实&#xff0c;原因有很多&#xff0c;比如代理服务器过多的连接…

高中生台灯什么牌子好?挑选不好可能会伤眼!

台灯是现在家庭都在使用的照明灯具&#xff0c;对于晚上工作学习、看书休闲都有很大的裨益&#xff0c;尤其是正在上学阶段的孩子&#xff0c;更是必备可少的学习“伴侣”。但是在挑选台灯的过程中也要注重护眼效果&#xff0c;在此基础上才是讨论性价比的问题&#xff0c;如果…

1本Frontiers期刊不再被收录,EI期刊目录已更新 (附8月最新刊源)!

近期爱思唯尔&#xff08;Elsevier&#xff09;官网更新了EI Compendex收录期刊目录&#xff0c;这是2023年第四次更新。 Elsevier发布2023年第四版EI期刊目录 更新时间&#xff1a;2023年7月1日 不同于SCI/SSCI目录每月更新一次的频率&#xff0c;EI目录更新没有规律可言&am…

结合ChatGPT和MINDSHOW自动生成PPT

结合chatGPT和MINDSHOW自动生成PPT应用场景 总结/朱季谦 一、首先&#xff0c;通过chatGPT说明你的需求&#xff0c;学会提问是Ai时代最关键的一步。你需要提供一些关键信息&#xff0c;如果没有关键信息&#xff0c;就按照大纲方式让它设计&#xff0c;例如&#xff0c;我让…

Day17 C++ 继承

C 继承 继承继承的基本语法继承的语法示例 继承方式公有继承&#xff08;public inheritance&#xff09;保护继承&#xff08;protected inheritance&#xff09;私有继承&#xff08;private inheritance&#xff09;总结 继承中的对象模型继承中构造和析构顺序构造顺序析构顺…

【WiFi】Hostapd工作流程分析

目录 1.Hostapd概述 2.Hostapd代码框架 3.Hostapd各种命令配置工具 4.hostaod的主函数 5.hostaod代码分析 1.Hostapd概述 Hostapd是一个运行在用户态的守护进程,可以通过Hostapd来读取配置文件,通过nl802.11来控制底层的状态如RTS/CTS beacon帧间隔等等信息;也可以读取相…

录音怎么转换成文字?这几种简单转换方法学起来

将录音转换成文字可以方便查找和引用重要信息&#xff0c;可以使用搜索功能快速找到关键词和短语&#xff0c;而无需听整个录音。其次&#xff0c;将录音转换成文字可以提高准确性和完整性&#xff0c;因为可以在记录文本中添加遗漏的细节和备注。此外&#xff0c;将录音转换成…

【cluster_block_exception】写操作elasticsearch索引报错

【cluster_block_exception】操作elasticsearch索引b报错 背景导致原因&#xff1a;解决方法&#xff1a; 背景 今天线上elk的数据太多&#xff0c;服务器的空间不足了。所以打算删除一些没用用的数据。我是用下面的request&#xff1a; POST /{index_name}/_delete_by_query…

Java基础面试题3

Java基础面试题 1&#xff1a;https://cloud.fynote.com/share/d/qPGzAVr5 2&#xff1a;https://cloud.fynote.com/share/d/MPG9AVsAG 3&#xff1a;https://cloud.fynote.com/share/d/qPGHKVsM 一、JavaWeb专题 1.HTTP响应码有哪些 1、1xx&#xff08;临时响应&#xf…

调整心态,走出焦虑,追求更高的自我!

每个人都希望能够成为最好的自己&#xff0c;追求自我提升和进步。然而&#xff0c;在这个竞争激烈的社会中&#xff0c;我们常常会感到焦虑和迷茫。看着周围的人在学习、工作、生活中取得成功&#xff0c;我们不禁会问自己&#xff0c;为什么他们能够做到&#xff0c;而我却做…

识别万物扫一扫,遇到不认识的物品扫就完事

随着科技的不断发展&#xff0c;移动设备已经成为人们日常生活中必不可少的工具。移动设备上的扫一扫功能&#xff0c;可以通过摄像头扫描物品&#xff0c;识别并获取相关信息&#xff0c;为人们的生活带来了很大的便利。本文将探讨识别万物扫一扫的使用及原理。 识别万物的使用…