C語(yǔ)言 函數(shù)的嵌套調(diào)用
C語(yǔ)言規(guī)定,一個(gè)函數(shù)可以調(diào)用另一個(gè)函數(shù),而被調(diào)用函數(shù)的函數(shù)體中也可以出現(xiàn)對(duì)另一個(gè)函數(shù)調(diào)用。c語(yǔ)言對(duì)函數(shù)的調(diào)用深度是沒(méi)有限制的,函數(shù)之間層層調(diào)用,最終實(shí)現(xiàn)復(fù)雜的程序功能。
在使用系統(tǒng)提供的庫(kù)函數(shù)時(shí)也經(jīng)常遇到函數(shù)嵌套的情況,例如:
sqrt(pow(b,2)-4*a*c)
要想求出sq「t()函數(shù)的值,必須先計(jì)算pow()函數(shù)的值。
【例題】編寫(xiě)函數(shù)計(jì)算
S=f(-n)+f(-n+1)+…f(-1)+f(0)+f(1)+…f(n-1)+f(n)
其中f(x)函數(shù)的定義為:
(x+1)/(x-2) 當(dāng)x>0且x不等于2
f(x)= 0 當(dāng)x=0且x等于2
(x-1)/(x-2) 當(dāng)x<0
算法分析:
定義兩個(gè)函數(shù),一個(gè)函數(shù)f()實(shí)現(xiàn)f(x)的功能,另一個(gè)函數(shù)sum()實(shí)現(xiàn)f(-n)+f(-n+1)+…f(-1)+f(0)+f⑴+…f(n-1)+f(n)的累加和。main()函數(shù)中調(diào)用sum()函數(shù),而為了實(shí)現(xiàn)sum()函數(shù),必須在sum()函數(shù)的函數(shù)體內(nèi)調(diào)用函數(shù)f()計(jì)算f(x)。這是一個(gè)函數(shù)嵌套調(diào)用的問(wèn)題。
數(shù)f()的函數(shù)內(nèi)部是一個(gè)多分支語(yǔ)句的形式,根據(jù)形參x的值決定函數(shù)返回值。
sum()函數(shù)的函數(shù)體主要是一個(gè)從-n到n的循環(huán),循環(huán)體重調(diào)用f()函數(shù),把循環(huán)變量作為實(shí)參傳遞給f()函數(shù)中的形參,并將函數(shù)返回值累加起來(lái)。
主函數(shù)中用來(lái)輸入變量n的值,調(diào)用sum()函數(shù),并輸出結(jié)果。
程序如下:
#include<stdio.h>
double sum(int n);
double f(double x);
main()
{
int n;
printf ("input n:\n");
scanf ("%d",&n);
printf("%f\n",sum(n));
}
double sum(int n)
{
int i;
double s=0;
for(i=-n;i<=n;i++)
s+=f(1.0*i);
return s;
}
double f(double x)
{
if(x==0 ||x==2)
return 0;
else if(x>0 && x!=2)
return(x+1)/(x-2):
else
return(x-1)/(x-2);
程序執(zhí)行時(shí),屏幕顯示提示信息:
input n:
輸入:
3
輸出結(jié)果為:
4.216667
從程序中可看出main()函數(shù)調(diào)用了sum()函數(shù),sum()函數(shù)為了得到結(jié)果又調(diào)用了f()函數(shù)。程序的具體執(zhí)行過(guò)程為:
①程序從main()函數(shù)開(kāi)始執(zhí)行,在main()函數(shù)體中執(zhí)行到調(diào)用sum()函數(shù)的語(yǔ)句時(shí),轉(zhuǎn)去執(zhí)行sum()函數(shù)。
②執(zhí)行sum()函數(shù)的開(kāi)頭部分。
③在sum()函數(shù)體中執(zhí)行到f()函數(shù)的調(diào)用語(yǔ)句,轉(zhuǎn)去執(zhí)行f()函數(shù)。
④執(zhí)行f()函數(shù)的開(kāi)頭部分。
⑤當(dāng)函數(shù)結(jié)束或遇到return語(yǔ)句時(shí),返回sum()函數(shù)調(diào)用處。
⑥返回sum()函數(shù)繼續(xù)執(zhí)行。
⑦當(dāng)遇到return語(yǔ)句后函數(shù)結(jié)束,返回main()函數(shù)調(diào)用處。
⑧繼續(xù)執(zhí)行main()函數(shù),直到結(jié)束。
最終形成的嵌套調(diào)用關(guān)系如圖所示。
從本程序中可以看出:
?程序中包含了三個(gè)函數(shù)main()、sum()和f()。這三個(gè)函數(shù)是互相獨(dú)立的,并沒(méi)有從屬關(guān)系。
?因?yàn)閟um()函數(shù)要調(diào)用f()函數(shù),并對(duì)f()函數(shù)的返回值進(jìn)行累加,所以sum()函數(shù)和f()函數(shù)均為double型。
?程序中main()函數(shù)在最前面,之后分別是sum()函數(shù)、f()函數(shù),為了方便,統(tǒng)一在所有函數(shù)最前面進(jìn)行函數(shù)聲明。
關(guān)于函數(shù)嵌套程序設(shè)計(jì)時(shí)需要注意的問(wèn)題:
?對(duì)于比較復(fù)雜的程序,可以使用嵌套的形式增加層次以降低復(fù)雜性。
?雖然理論上對(duì)嵌套層次沒(méi)有要求,但嵌套層次太多,每層嵌套又都需要消耗內(nèi)存空間,所以如果嵌套層數(shù)太多,一不利于代碼易讀性,二可能因內(nèi)存問(wèn)題造成程序崩潰。
點(diǎn)擊加載更多評(píng)論>>