内容正文:
6.2 函数的嵌套调用和递归调用
6.2.1函数的嵌套调用
1.引例
例6.9 验证任意偶数为两个素数之和并输出这两个素数。
假设验证的数放在变量x中,可依次从x中减去i,i从2变化到x/2,步骤如下:
(1)i初值为2。
(2)判断i是否是素数。若是,执行步骤(3);若不是,执行步骤(5)。
(3)判断x-i是否是素数,若是,执行步骤(4);若不是,执行步骤(5)。
(4)输出结果。
(5)使i增1。
(6)重复执行步骤(2),直到i>x/2。
下一页
返回
6.2 函数的嵌套调用和递归调用
2.说明
(1)C语言不允许函数嵌套定义,但允许在一个函数的函数体中出现对另一个函数的调用。所谓函数的嵌套调用是指在执行被调用函数时,被调用函数又调用了其它函数。这与其它语言的子程序嵌套调用的情形是类似的,其关系可表示为如图6-1。
上一页
下一页
返回
6.2 函数的嵌套调用和递归调用
(2)图6-1表示了两层嵌套的情形。其执行过程是:
执行main()函数中调用f1()函数的语句时,即转去执行f1()函数;在f1()函数中调用f2()函数时,又转去执行f2()函数;f2()函数执行完毕,返回f1()函数的断点,继续执行其后续语句;f1()函数执行完毕,返回main()函数的断点,继续执行后续语句。
上一页
下一页
返回
6.2 函数的嵌套调用和递归调用
6.2.2函数的递归调用
1.引例
例6.11 用递归法计算n!。
long power(int n)
{ long f;
if (n>1) f=power(n-1)*n;
else f=1;
return (f);
}
上一页
下一页
返回
6.2 函数的嵌套调用和递归调用
main()
{ int n;
long y;
printf("Input a integer number: ");
scanf("%d",&n);
y=power(n);
printf("%d!=%ld
",n,y);
getch();
}
上一页
下一页
返回
6.2 函数的嵌套调用和递归调用
2.说明
(1)函数的递归调用是C语言的一大特色,递归函数既是主调函数,同时又是被调用函数,执行递归函数将反复调用其自身。每调用一次就进入新的一层。例如,在图6-2中,函数f()为直接递归函数,函数f1()和函数f2()为间接递归函数。
上一页
下一页
返回
6.2 函数的嵌套调用和递归调用
(2)如果递归函数无休止地调用其自身,这当然是不正确的。为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。这个条件称为递归结束条件。
(3)递归调用的执行过程分析
运行例6.11程序时,输入值为5,即求5!。在主函数中的调用语句即为y=power(5),进入power()函数后,由于n=5,大于1,故执行f=power(n-1)*n,即f=power(5-1)*5。该语句对power()函数作递归调用,即power(4)。逐次递归展开,如图6-3所示。
上一页
返回
6.3 内部变量与外部变量
6.3.1内部变量
1.内部变量的概念和定义
在一个函数(包括main()函数)内部或复合句内部定义的变量称为内部变量,自然,函数的形参属于内部变量。内部变量只在该函数范围内或该复合句范围内有效。也就是说,内部变量的作用域局限于定义它的函数或复合句内部,在此函数之外或此复合句之外就不能使用这些变量了。所以内部变量也称局部变量。
下一页
返回
6.3 内部变量与外部变量
2.说明
(1)主函数main()中定义的内部变量,也只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的内部变量。因为主函数也是一个函数,与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。
(2)形参变量也是内部变量,属于被调用函数;实参变量,则是主调函数的内部变量。
(3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的存储单元,互不干扰,也不会发生混淆。
(4)在复合句中也可定义变量,其作用域只在复合句范围内。
上一页
下一页
返回
6.3 内部变量与外部变量
6.3.2外部变量
1.外部变量的概念和定义
在函数外部定义的变量称为外部变量。外部变量不属于任何一个函数,其作用域是:从外部变量的定义位置开始,到本源文件结束为止。外部变量可被