全國(guó)計(jì)算機(jī)二級(jí)考試輔導(dǎo):C語(yǔ)言之函數(shù)(3)

字號(hào):

C語(yǔ)言中不允許作嵌套的函數(shù)定義。因此各函數(shù)之間是平行的,不存在上一級(jí)函數(shù)和下一級(jí)函數(shù)的問(wèn)題。 但是C語(yǔ)言允許在一個(gè)函數(shù)的定義中出現(xiàn)對(duì)另一個(gè)函數(shù)的調(diào)用。 這樣就出現(xiàn)了函數(shù)的嵌套調(diào)用。即在被調(diào)函數(shù)中又調(diào)用其它函數(shù)。 這與其它語(yǔ)言的子程序嵌套的情形是類似的。其關(guān)系可表示如圖5.2。
    圖5.2表示了兩層嵌套的情形。其執(zhí)行過(guò)程是:執(zhí)行main函數(shù)中調(diào)用a函數(shù)的語(yǔ)句時(shí),即轉(zhuǎn)去執(zhí)行a函數(shù),在a函數(shù)中調(diào)用b 函數(shù)時(shí),又轉(zhuǎn)去執(zhí)行b函數(shù),b函數(shù)執(zhí)行完畢返回a函數(shù)的斷點(diǎn)繼續(xù)執(zhí)行,a 函數(shù)執(zhí)行完畢返回main函數(shù)的斷點(diǎn)繼續(xù)執(zhí)行。
    [例5.8]計(jì)算s=22! 32!
    本題可編寫(xiě)兩個(gè)函數(shù),一個(gè)是用來(lái)計(jì)算平方值的函數(shù)f1, 另一個(gè)是用來(lái)計(jì)算階乘值的函數(shù)f2。主函數(shù)先調(diào)f1計(jì)算出平方值, 再在f1中以平方值為實(shí)參,調(diào)用 f2計(jì)算其階乘值,然后返回f1,再返回主函數(shù),在循環(huán)程序中計(jì)算累加和。
    long f1(int p)
    {
    int k;
    long r;
    long f2(int);
    k=p*p;
    r=f2(k);
    return r;
    }
    long f2(int q)
    {
    long c=1;
    int i;
    for(i=1;i<=q;i )
    c=c*i;
    return c;
    }
    main()
    {
    int i;
    long s=0;
    for (i=2;i<=3;i )
    s=s f1(i);
    printf("\ns=%ld\n",s);
    }
    long f1(int p)
    {
    ……
    long f2(int);
    r=f2(k);
    ……
    }
    long f2(int q)
    {
    ……
    }
    main()
    { ……
    s=s f1(i);
    ……
    }
    在程序中,函數(shù)f1和f2均為長(zhǎng)整型,都在主函數(shù)之前定義, 故不必再在主函數(shù)中對(duì)f1和f2加以說(shuō)明。在主程序中, 執(zhí)行循環(huán)程序依次把i值作為實(shí)參調(diào)用函數(shù)f1求i2值。在f1中又發(fā)生對(duì)函數(shù)f2的調(diào)用,這時(shí)是把i2的值作為實(shí)參去調(diào)f2,在f2 中完成求i2! 的計(jì)算。f2執(zhí)行完畢把C值(即i2!)返回給f1,再由f1 返回主函數(shù)實(shí)現(xiàn)累加。至此,由函數(shù)的嵌套調(diào)用實(shí)現(xiàn)了題目的要求。 由于數(shù)值很大, 所以函數(shù)和一些變量的類型都說(shuō)明為長(zhǎng)整型,否則會(huì)造成計(jì)算錯(cuò)誤。
    函數(shù)的遞歸調(diào)用
    一個(gè)函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。 這種函數(shù)稱為遞歸函數(shù)。C語(yǔ)言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中, 主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身。 每調(diào)用一次就進(jìn)入新的一層。例如有函數(shù)f如下:
    int f (int x)
    {
    int y;
    z=f(y);
    return z;
    }
    這個(gè)函數(shù)是一個(gè)遞歸函數(shù)。 但是運(yùn)行該函數(shù)將無(wú)休止地調(diào)用其自身,這當(dāng)然是不正確的。為了防止遞歸調(diào)用無(wú)終止地進(jìn)行, 必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的辦法是加條件判斷, 滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。 下面舉例說(shuō)明遞歸調(diào)用的執(zhí)行過(guò)程。
    [例5.9]用遞歸法計(jì)算n!用遞歸法計(jì)算n!可用下述公式表示:
    n!=1 (n=0,1)
    n×(n-1)! (n>1)
    按公式可編程如下:
    long ff(int n)
    {
    long f;
    if(n<0) printf("n<0,input error");
    else if(n==0||n==1) f=1;
    else f=ff(n-1)*n;
    return(f);
    }
    main()
    {
    int n;
    long y;
    printf("\ninput a inteager number:\n");
    scanf("%d",&n);
    y=ff(n);
    printf("%d!=%ld",n,y);
    }
    long ff(int n)
    { ……
    els
    e f=ff(n-1)*n;
    ……
    }
    main()
    { ……
    y=ff(n);
    ……
    }