函数的嵌套、递归调用
一 、课前知识提前学习
1、函数嵌套调用
C程序全部都是由函数组成的,除主函数main()外,每个函数之间都是平等和独立的。彼此可以相互调用,亦可调用自身。正是函数之间的层层调用,最终完成复杂的程序功能。
嵌套调用
嵌套调用是指一个函数调用另一个函数(不包括调用自身),这个被调用函数还可以调用其他函数,形成任何深度的调用层次。例如:
float myfabs(float x)
{
return x>0 x:-x;
}
float myfunc(float r)
{
return 2*myfabs(r)+1;
}
void main()
{
float f=0.5;
printf("%f",myfunc(f));
}
main函数中的printf()函数在调用myfunc()函数时, myfunc()函数又嵌套调用了myfabs()函数。函数myfabs()计算完成后,将结果返回到myfunc()函数;函数myfunc()计算完成后,将结果返回到printf()。待主函数所有语句执行完成后,程序结束。函数之间的调用关系如图1所示。
图1 函数嵌套调用示意图
2、函数递归调用
递归调用
在调用一个函数的过程中,函数的某些语句又直接或间接的调用函数本身,这种函数调用自身的调用形式形成了函数的递归调用。根据调用方式不同分为直接递归(图1)和间接递归(图2)两种形式。
图 1 直接递归调用 图2 间接递归调用
图1所示直接递归调用,在func函数内部至少有一条语句调用自身函数。
直接递归调用代码示例如下:
void printn(int n)
{
if(n>=10)return;
printf("%3d",n);
n++;
printn(n);
}
其中的printn()为直接递归函数。
图2所示间接递归调用,在func1函数内部的某条语句调用了func2,而func2函数的某条语句又调用了func1。
不论是直接递归调用还是间接递归调用,主调函数又是被调函数,递归调用都形成了调用的回路,如果递归的过程没有一定的中止条件,程序就会陷入类似死循环一样的情况,最终会导致内存缓冲区溢出的错误。因此,在设计递归函数时,必须有一个结束递归过程的条件,一定要保证递归过程在某种条件下可以结束。