C语言的函数,什么是递归?如何定义、调用递归函数?
yuyutoo 2024-12-17 17:24 3 浏览 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函数。这样,就结束了函数的递归调用。
相关推荐
- C语言头文件中 #ifndef #define #endif 的作用
-
头文件的第一个功能就是#include指令,即在预编译时把它后面所写的那个文件的内容,完完整整地一字不改地包含到当前的文件中来。多次包含相同的头文件,会导致编译器多次编译该头文件,代码量小还好,代...
- SpringBoot中静态变量注入方案,一网打尽
-
前言Hi,大家好,我是麦洛,昨天同事来找我。说自己想使用@Value注解来注入值,但是发现注入不进去,想让我帮忙看看。研究了一番,最后发现是@Value注解无法注入静态变量。下面我们一起来回顾一下本次...
- java各种类型变量你还不傻傻分不清?最全的变量都在这
-
前言互联网上有很多关于变量的解释。质量参差不齐,所以我写了这篇文章和我的理解。如果有什么不对劲的地方,速速指教。变量是我们经常使用的一种类型。当我第一次学习Java时,我经常被各种变量的概念所折磨。那...
- (建议收藏)关于单片机检查变量的方法,你会几种?
-
这些单片机调试方法你真的知道吗?导读:授人以鱼不如授人以渔,为什么那些前辈们能快捷定位问题,这个系列的文章将揭秘KEIL调试那些不为人知的事。以下内容更适用于STM32单片机(51也支持局部...
- Excel VBA入门教程1.2 常量和变量
-
定义后不能被改变的量,就是常量;相反的...
- "两组"连续变量之间的相关分析(SPSS:典型相关分析)
-
典型相关分析的基本思路:首先采用类似主成分分析的方法,在两组连续变量中分别提取变量的线性组合(综合变量),使两组的综合变量间具有最大的相关性。然后在两组连续变量中分别提取第二对线性组合,使提取的综合变...
- CPU眼里的:静态、全局、临时变量
-
“静态、全局、临时变量,它们有什么区别?为什么要把变量分成这么多的类别?这么做的意义在哪里?有什么好处呢?...
- C语言变量的初始值,隐藏很多危险?如何危险?
-
变量的初始值局部变量如果没初始化,那么,变量的值是创建变量,申请内存空间的时候,内存空间存放的数据。所以,局部变量得到的数据是一个随机值。就是变量空间中,存放的原始内存数据。全局变量如果没有初始化,那...
- C语言里的static变量其他语言是看不上还是学不去?
-
C语言里的static变量其他语言是看不上还是学不去?static变量在C语言中被用于具有静态存储期的局部变量或全局变量。它有以下几个特点:1.静态存储期:static变量在程序执行时分配内存,直到...
- 静态变量是在什么时候被加载的?是编译器还是在运行期?
-
静态变量的加载过程一般情况下是发生在在程序运行时的初始化阶段。具体来讲是在程序运行的时候,当类被第一次被加载到内存中的时候。这也就是是说,一个静态变量的生命周期是从类第一次被加载到内存时开始,直到程序...
- C语言的随机数函数和静态变量
-
ANSI-C库提供了rand()函数生成随机数。生成随机数有多种算法,ANSI-C允许C实现针对特定机器使用最佳算法。然而,ANSI-C标准还提供了一个可移植的标准算法,在不同系统中生成相同的随机数。...
- 「C++学习笔记(十)」理解类中的静态成员变量与静态成员函数
-
一.类的静态成员大家应该都知道静态变量,就是在变量前面加上static,类的静态成员也是同样的道理,在类的成员函数与成员变量前面加上static声明为类的静态成员。和静态变量的原理一样,不管这个类创...
- CPU眼里的:变量
-
“变量,是所有编程语言的基本元素,但变量的物理意义,你有了解过吗?是的,没有物理意义,变量的语法意义将荡然无存!...
- 【VBA基础】变量的类型和申明变量类型的重要性
-
各位朋友,你们好,今天和你们聊点VBA基础知识:VBA变量。注:此文字数约3500字,主要是讲解VBA变量知识,通过一些动图展示变量上的效果;如果你是初学者,建议先收藏此文,看看最后给初学者的建议那一...
- 变量,还有这些秘密
-
1、变量的意义任何一门高级开发语言,都离不开变量。通过变量,编程语言才能搬运和表达我们的小心思。变量是机器指令语义化的第一步,却是高级开发语言进化的一大步。2、变量的起源在计算机编年史里的蛮荒时代,人...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)