C语言函数的递归调用
一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
C语言函数的递归调用根据公式编程:
long factorial(int n){
long result;
if(n==0 || n==1){
result = 1;
}else{
result = factorial(n-1) * n; // 递归调用
}
return result;
}
这是一个典型的递归函数。调用factorial后即进入函数体,只有当 n==0 或 n==1 时函数才会执行结束,否则就一直调用它自身。
由于每次调用的.实参为 n-1,即把 n-1 的值赋给形参 n,所以每次递归实参的值都减 1,直到最后 n-1 的值为 1 时再作递归调用,形参 n 的值也为1,递归就终止了,会逐层退出。
例如求 5!,即调用factorial(5)。当进入factorial函数体后,由于 n=5,不等于0或1,所以执行result = factorial(n-1) * n;,即result = factorial(5-1) * 5;,接下来也就是调用factorial(4)。这是第一次递归。
进行四次递归调用后,实参的值为 1,也就是调用factorial(1)。这时递归就结束了,开始逐层返回。factorial(1) 的值为 1,factorial(2) 的值为 1*2=2,factorial(3) 的值为 2*3=6,factorial(4) 的值为 6*4=24,最后返回值 factorial(5) 为 24*5=120。
注意:为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。
递归调用不但难于理解,而且开销很大,如非必要,不推荐使用递归。很多递归调用可以用迭代(循环)来代替。
【示例】用迭代法求 n!。
复制纯文本新窗口
long factorial(int n){
int i;
long result=1;
if(n==0 || n==1){
return 1;
}
for(i=1; i<=n; i++){
result *= i;
}
return result;
}
-
C语言中gets()函数知识
导语:gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。。下面是C语言中gets()函数知识,一起来学习下吧:gets()函数用于从缓冲区中读取字符串,其原型如下:char*gets(cha...
-
C与C++之间相互调用的实例方法
如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用__cplusplus预处理器宏确定正在编译的语言。如果是从C++语言模块使用,则用C链接声明这些函数。如果使用此技术并为DLL提供头文件,则这些函数可以原封不动地由C和C++模块使用。下面是小编为大家...
-
浅谈高职C语言课程的教学分析与设计
C语言作为学院网络技术专业的人门课程,旨在通过锻炼学生的逻辑思维,墙养学生在职业岗位中实际应用的能力.目前,该专业的学生毕业后主要从事网站开发和网络管理等方面的工作,而在这些领域几乎都以C语言作为应用的开发工具.但从历年教学实践来看,教师往往付出的精力多...
-
C语言的第一个程序
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的`编程语言。下面小编带大家看看第一个C语言程序。第一个C语言程序实例说明输出"Hello,world!"是...