百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

C语言的函数,什么是递归?如何定义、调用递归函数?

yuyutoo 2024-12-17 17:24 14 浏览 0 评论

9 函数递归调用

我们学习了函数的嵌套调用,可以在函数中调用函数。那么,如果在一个函数中,调用自己这个函数,那么,这个执行过程称为:函数递归调用。这个函数也称为:递归函数。程序测试例子:

深入学习,可以交个朋友,工人人人号:韦凯峰linux编程学堂

程序运行结果如下:

深入学习,可以交个朋友,工人人人号:韦凯峰linux编程学堂

在这个测试例子中,我们定义了func函数,在func函数中又调用了func函数自己;所以,这个过程称为:递归调用

我们知道,在程序的执行过程中,碰到函数调用的时候,就跳转到函数定义的函数体中执行,那么,函数的递归调用。就是函数又跳转到自己定义的函数体中运行;那么,我们分析上面例子中,函数的递归调用执行过程:

(1) 程序从main函数开始,执行到func(3);代码,就跳转到func函数中执行;

(2) 执行func(3);代码,就是把实参3数值,传递给形参变量x;然后,执行x--;形参变量x的值变为2;接着执行if(x <= 0)判断,由于变量x的值等于2,大于0,所以,没有执行return语句,继续执行:

printf("x = %d\n", x);

func(x);

此时,输出调试信息,然后,执行func(x);代码,就是在func函数中调用func函数,就是递归调用,由于x变量值为2,相当于执行func(2);代码。

(3) 执行func(2);代码,把实参2数值传递个形参变量x,然后,执行x--;形参变量x的值变为1;接着执行if(x <= 0)判断,由于变量x的值等于1,大于0,所以,没有执行return语句,继续执行:

printf("x = %d\n", x);

func(x);

此时,输出调试信息,然后,执行func(x);代码,递归调用,由于x变量值为1,相当于执行func(1);代码。

(4) 执行func(1);代码,把实参1数值传递个形参变量x,然后,执行x--;形参变量x的值变为0;接着执行if(x <= 0)判断,由于变量x的值等于0,所以,执行return语句,结束func(1)函数调用。

(5) 结束func(1)函数调用,就返回到func(2)的调用,func(2)函数执行结束之后,返回到func(3)函数的调用;

(6) 最后,func(3)函数调用结束,就返回到main函数中继续执行。

那么,这个函数递归调用的过程,可以总结成如下图:

深入学习,可以交个朋友,工人人人号:韦凯峰linux编程学堂

可以看到,函数的调用调用流程如下:

func(3) à func(2) à func(1)

那么,当调用到func(1)的时候,进入func函数,执行x--语句,变量x的值变为0,然后,判断if(x <= 0)语句,由于 x<=0 表达式的值为真,所以,执行return语句,结束func(1)函数的调用。

结束func(1)函数的调用之后,返回到func(2)函数,然后,执行:

printf("call end, x = %d\n", x);

输出 call end, x = 2 语句,就是说明返回到func(2)函数的调用中。然后,结束func(2)函数的调用之后,返回到func(3)函数。结束func(3)函数调用之后,就返回到man函数中。

注意:递归函数就是重复调用自己的函数。那么,函数不可以无限地调用自己,否则,出现函数栈调用异常。所以,递归调用的函数,应该有结束递归调用的时候。例如上面测试的例子中,func函数递归调用,会判断变量x,如果 if(x <= 0)判断成立,则执行return语句,退出函数运行,不再递归调用func函数。这样,就结束了函数的递归调用。

相关推荐

TCP协议原理,有这一篇就够了

先亮出这篇文章的思维导图:TCP作为传输层的协议,是一个软件工程师素养的体现,也是面试中经常被问到的知识点。在此,我将TCP核心的一些问题梳理了一下,希望能帮到各位。001.能不能说一说TC...

Win10专业版无线网络老是掉线的问题

有一位电脑基地的用户,使用...

学习计算机网络需要掌握以下几方面基础知识

计算机基础知识操作系统:了解常见操作系统(如Windows、Linux)的基本操作和网络配置,例如如何设置IP地址、子网掩码、网关和DNS服务器等,以及如何通过命令行工具(如ping、tr...

网络工程师的圣经!世界级网工手绘268张图让TCP/IP直接通俗易懂

要把知识通俗地讲明白,真的不容易。——读者说TCP/IP从字面意义上讲,有人可能会认为TCP/IP是指TCP和IP两种协议。实际生活当中有时候也确实就是这两种协议。然而在很多情况下,它只是...

三分钟了解通信知识TCP与IP协议(含“通信技术”资料分享)

TCP/IPTCP/IP分层模型①应用层...

网闸与防火墙:网络安全设备的差异与应用

在网络安全领域,网闸(安全隔离网闸,GAP)和防火墙(Firewall)是两类重要的防护设备。尽管它们都服务于网络安全防护,但在设计理念、技术原理、安全效能及适用场景等方面存在显著差异,以下从五个维度...

S7-300的TCP/IP通信

一、首先在项目中创建2个S7-300的站点;二、硬件组态中,设置合适的TCP/IP地址,在同一网段内;...

西门子S7-1500 PLC的 MODBUS TCP通信

MODBUSTCP使MODBUS_RTU协议运行于以太网,MODBUSTCP使用TCP/IP和以太网在站点间传送MODBUS报文,MODBUSTCP结合了以太网物理网络和网络标准TC...

系统规划与管理师新版备考必备:第7章考点思维导图解析

备考系统规划与管理师的小伙伴们,福利又来啦!今天为大家带来《系统规划与管理师(第2版)》第7章考点的思维导图,助你高效梳理重点,让备考更有方向!...

TCP/IP、Http、Socket 有何区别与联系?

HTTP协议对应于应用层,Socket则是对TCP/IP协议的封装和应用(程序员层面上)。HTTP是应用层协议,主要解决如何包装数据。而我们平时说的最多的Socket是什么呢?实际上...

西门子PLC串口协议与以太网通信协议对比

西门子plc品牌众多,通信协议的类型就更多了,具体可分为串口协议和以太网通信协议两大类。...

网络编程懒人入门(十三):一泡尿的时间,快速搞懂TCP和UDP的区别

本文引用了作者Fundebug的“一文搞懂TCP与UDP的区别”一文的内容,感谢无私分享。1、引言...

程序员必备的学习笔记《TCP/IP详解(一)》

为什么会有TCP/IP协议在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样...

一文读懂TCP/IP协议工作原理和工作流程

简述本文主要介绍TCP/IP协议工作原理和工作流程。含义TCP/IP协议,英文全称TransmissionControlProtocol/InternetProtocol,包含了一系列构成互联网...

如何在 Windows 10 和 Windows 11 上重置 TCP/IP 堆栈

传输控制协议/Internet协议,通常称为TCP/IP,是您的WindowsPC如何与Internet上的其他设备进行通信的关键部分。但是当事情出错时会发生什么?你如何解决它?幸运的...

取消回复欢迎 发表评论: