![C語(yǔ)言程序設(shè)計(jì)函數(shù)市公開(kāi)課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第1頁(yè)](http://file4.renrendoc.com/view/7215da9409b7bfc5514f0985544adde9/7215da9409b7bfc5514f0985544adde91.gif)
![C語(yǔ)言程序設(shè)計(jì)函數(shù)市公開(kāi)課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第2頁(yè)](http://file4.renrendoc.com/view/7215da9409b7bfc5514f0985544adde9/7215da9409b7bfc5514f0985544adde92.gif)
![C語(yǔ)言程序設(shè)計(jì)函數(shù)市公開(kāi)課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第3頁(yè)](http://file4.renrendoc.com/view/7215da9409b7bfc5514f0985544adde9/7215da9409b7bfc5514f0985544adde93.gif)
![C語(yǔ)言程序設(shè)計(jì)函數(shù)市公開(kāi)課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第4頁(yè)](http://file4.renrendoc.com/view/7215da9409b7bfc5514f0985544adde9/7215da9409b7bfc5514f0985544adde94.gif)
![C語(yǔ)言程序設(shè)計(jì)函數(shù)市公開(kāi)課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第5頁(yè)](http://file4.renrendoc.com/view/7215da9409b7bfc5514f0985544adde9/7215da9409b7bfc5514f0985544adde95.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章函數(shù)第1頁(yè)模塊化程序設(shè)計(jì)基本思想:將大程序按功效分割成一些小模塊,特點(diǎn):各模塊相對(duì)獨(dú)立、功效單一、結(jié)構(gòu)清楚簡(jiǎn)單控制了程序設(shè)計(jì)復(fù)雜性每個(gè)模塊簡(jiǎn)單,所以可靠性高防止程序開(kāi)發(fā)重復(fù)勞動(dòng),縮短開(kāi)發(fā)周期易于維護(hù)和功效擴(kuò)充開(kāi)發(fā)方法:自上向下,逐步分解,分而治之,是面向過(guò)程程序設(shè)計(jì)語(yǔ)言關(guān)鍵第7章函數(shù)7.1.1C程序結(jié)構(gòu)第2頁(yè)
C程序基本結(jié)構(gòu)C程序源程序文件1源程序文件2源程序文件n…預(yù)編譯命令函數(shù)1函數(shù)2…說(shuō)明部分執(zhí)行部分第3頁(yè)可由一個(gè)或多個(gè)源程序文件組成;每個(gè)源程序文件又由若干函數(shù)組成;但整個(gè)程序有且僅有一個(gè)主函數(shù);程序運(yùn)行時(shí)從main函數(shù)開(kāi)始執(zhí)行,main函數(shù)可調(diào)用其它函數(shù),最終一律返回到main函數(shù)結(jié)束運(yùn)行。除main函數(shù)外,其它函數(shù)可相互調(diào)用;函數(shù)不可嵌套定義,含有全局性、平行性;函數(shù)分為有參加無(wú)參函數(shù),有返回值和無(wú)返回值函數(shù),主調(diào)和被調(diào)函數(shù)
C程序特點(diǎn):第4頁(yè)函數(shù)分類按照函數(shù)定義角度分為:1.標(biāo)準(zhǔn)庫(kù)函數(shù):是由系統(tǒng)定義地,也無(wú)須在程序中進(jìn)行類型說(shuō)明,要調(diào)用某個(gè)庫(kù)函數(shù),則要用預(yù)處理命令#include將該函數(shù)所在頭文件包含到程序中。使用庫(kù)函數(shù)應(yīng)注意:1、函數(shù)功效2、函數(shù)參數(shù)數(shù)目和次序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用包含文件第5頁(yè)當(dāng)標(biāo)準(zhǔn)庫(kù)函數(shù)中沒(méi)有用戶要用函數(shù)時(shí),就必須自己設(shè)計(jì)了,設(shè)計(jì)函數(shù)標(biāo)準(zhǔn)是:1,函數(shù)不應(yīng)處理太多功效,要保持函數(shù)小型化,功效單一化.
2,一個(gè)函數(shù)要保持自己獨(dú)立性,如同一個(gè)黑匣子一樣,有進(jìn)有出.
3,在函數(shù)中多使用復(fù)合語(yǔ)句,使函數(shù)也含有結(jié)構(gòu)化,而且能夠提升執(zhí)行效率和節(jié)約存放空間.
4,在主函數(shù)前,要羅列出全部使用自定義函數(shù)原型說(shuō)明,這有利于在大型程序設(shè)計(jì)中追蹤要調(diào)用函數(shù)設(shè)置是否正確.
5,在程序適當(dāng)?shù)胤郊尤胱⑨?用/*...*/包含語(yǔ)句)這便于程序閱讀和調(diào)試.
6,采取層次書(shū)寫程序格式,按程序不一樣功效分層次.2.用戶自定義函數(shù)第6頁(yè)按照函數(shù)參數(shù)傳遞形式分為:無(wú)參函數(shù)有參函數(shù)按照函數(shù)返回值類型分為:有返回值無(wú)返回值按照函數(shù)使用范圍分為:內(nèi)部函數(shù)外部函數(shù)按函數(shù)定義形式和使用范圍分類:第7頁(yè)8.2函數(shù)定義------無(wú)參函數(shù)定義類型名函數(shù)名(){申明部分執(zhí)行部分}說(shuō)明:類型名為函數(shù)返回值類型,假如定義時(shí)未指定,系統(tǒng)默認(rèn)為int型;無(wú)返回值函數(shù)類型名應(yīng)為void。函數(shù)名須是正當(dāng)標(biāo)識(shí)符,不能與其它函數(shù)或變量重名第8頁(yè)#include<stdio.h>voidprintstar(){printf("*************\n");}voidprint_message(){printf("Howareyou!\n");}main(){
printstar();print_message();printstar();}第9頁(yè)類型標(biāo)識(shí)符函數(shù)名(形參表列){申明部分執(zhí)行部分}形參表列必須申明形參類型函數(shù)定義------有參函數(shù)定義形參類型說(shuō)明表,普通格式為:數(shù)據(jù)類型1形參1,…,數(shù)據(jù)類型n形參n第10頁(yè)#include<stdio.h>floataverage(floatx,floaty,floatz)
{floataver;aver=(x+y+z)/3;return(aver);}main(){floata,b,c,ave;a=6.5;b=4.2;c=25.3;
ave=average(a,b,c);
printf(“average=%f”,ave);}第11頁(yè)void函數(shù)名(){}函數(shù)體能夠沒(méi)有,表示占個(gè)位置,實(shí)現(xiàn)功效以后補(bǔ)寫。函數(shù)定義------空函數(shù)定義第12頁(yè)/*求最大值*/voidmax(intx[]){/*求最大值*/}空函數(shù)應(yīng)用main(){inta[10]={….};
/*求最大值*/intm_max=max(a);printf(“m_max=%d”,m_max);}第13頁(yè)函數(shù)調(diào)用:
1、主調(diào)函數(shù)與被調(diào)函數(shù)main函數(shù)是整個(gè)程序執(zhí)行入口程序執(zhí)行是從main函數(shù)開(kāi)始普通函數(shù)必須由main函數(shù)(或其它函數(shù))調(diào)用才能執(zhí)行。函數(shù)調(diào)用關(guān)系示意圖第14頁(yè)2、函數(shù)參數(shù)和函數(shù)值函數(shù)參數(shù)分為:實(shí)際參數(shù)和形式參數(shù)在函數(shù)定義函數(shù)首部,函數(shù)名后括號(hào)中說(shuō)明變量,簡(jiǎn)稱形參。形參個(gè)數(shù)能夠有多個(gè),多個(gè)形參之間用逗號(hào)隔開(kāi)。形式參數(shù):實(shí)際參數(shù):函數(shù)被調(diào)用時(shí),在調(diào)用處給出對(duì)應(yīng)參數(shù),簡(jiǎn)稱實(shí)參,實(shí)參往往是含有明確值常量、變量或表示式等。第15頁(yè)#include<stdio.h>floataverage(floatx,floaty,floatz)
{floataver;aver=(x+y+z)/3;return(aver);}main(){floata,b,c,ave;a=6.5;b=4.2;c=25.3;
ave=average(a,b,c);
printf(“average=%f”,ave);}形式參數(shù)(形參)實(shí)際參數(shù)(實(shí)參)第16頁(yè)注意:1.形參在未出現(xiàn)函數(shù)調(diào)用時(shí),他們并不占內(nèi)存,只有發(fā)生函數(shù)調(diào)用時(shí)才會(huì)被分配空間,而且在該函數(shù)結(jié)束后,它所占全部?jī)?nèi)存也被釋放;2.實(shí)參必須是含有確定值常量,變量或表示式;3.形參必須在定義時(shí)就申明其類型;6.實(shí)參加形參類型應(yīng)相同或賦值兼容;7.C語(yǔ)言要求,實(shí)參加形參之間必須是單向值傳遞。4.實(shí)參個(gè)數(shù)和形參個(gè)數(shù)應(yīng)該相等;5.實(shí)參加形參在次序上應(yīng)該一一對(duì)應(yīng);參數(shù)結(jié)合問(wèn)題:在函數(shù)調(diào)用時(shí),將實(shí)參值傳給對(duì)應(yīng)形參第17頁(yè)比如:編一程序,將主函數(shù)中兩個(gè)變量值傳遞給swap函數(shù)中兩個(gè)形參,交換兩個(gè)形參值。#include<stdio.h>voidswap(intx,inty){intz;z=x;x=y;y=z; printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;swap(a,b);printf("\na=%d,b=%d\n",a,b);}形式參數(shù)(形參)實(shí)際參數(shù)(實(shí)參)單向值傳遞第18頁(yè)比如:編一程序,將主函數(shù)中兩個(gè)變量值傳遞給swap函數(shù)中兩個(gè)形參,交換兩個(gè)形參值。#include<stdio.h>voidswap(intx,inty){intz;z=x;x=y;y=z; printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;swap(a,b);printf("\na=%d,b=%d\n",a,b);}程序輸出結(jié)果:x=20,y=10a=10,b=20mainswap20b10az10y20x101020交換失敗第19頁(yè)例計(jì)算x立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728第20頁(yè)函數(shù)值即函數(shù)返回值,是經(jīng)過(guò)函數(shù)中return語(yǔ)句取得.return語(yǔ)句普通形式:return(表示式);return表示式;執(zhí)行過(guò)程:執(zhí)行return語(yǔ)句后,假如該表示式類型與函數(shù)首部中定義函數(shù)類型一致,則直接將結(jié)果返回主調(diào)函數(shù);不然,系統(tǒng)自動(dòng)將結(jié)果類型轉(zhuǎn)換成定義函數(shù)類型。第21頁(yè)無(wú)返回值函數(shù)
假如被調(diào)用函數(shù)中沒(méi)有return語(yǔ)句,函數(shù)帶回是一個(gè)不確定值。為了明確表示“不帶回值”,能夠用“void”定義“無(wú)類型”(或稱“空類型”)。這么,系統(tǒng)就確保不使函數(shù)帶回任何值,即禁止在調(diào)用函數(shù)中使用被調(diào)用函數(shù)返回值。為使程序降低犯錯(cuò),凡不要求帶回函數(shù)值函數(shù),普通應(yīng)定義為"void"類型。printstar(){printf("************\n");}voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}第22頁(yè)經(jīng)過(guò)return語(yǔ)句只能返回一個(gè)數(shù)值。函數(shù)內(nèi)可有多條返回語(yǔ)句,但每條返回語(yǔ)句返回值只有一個(gè)。當(dāng)函數(shù)不需指明返回值時(shí),能夠?qū)懗桑?/p>
return;當(dāng)函數(shù)中無(wú)返回語(yǔ)句時(shí),表示最終一條語(yǔ)句執(zhí)行完后遇
}
自動(dòng)返回。說(shuō)明:第23頁(yè)函數(shù)調(diào)用函數(shù)調(diào)用是使函數(shù)進(jìn)行一次實(shí)際執(zhí)行。格式:函數(shù)名(實(shí)際參數(shù)表)說(shuō)明實(shí)參在調(diào)用時(shí)必須有確定值,能夠是常量、變量和表示式。函數(shù)實(shí)參和形參應(yīng)在個(gè)數(shù)、類型和次序上一一對(duì)應(yīng),不然會(huì)發(fā)生類型不匹配錯(cuò)誤。對(duì)于無(wú)參函數(shù),調(diào)用時(shí)實(shí)參表列為空,但()不能省 。第24頁(yè)按函數(shù)在程序中出現(xiàn)位置有以下3種函數(shù)調(diào)用方式:函數(shù)調(diào)用方式
1.函數(shù)語(yǔ)句調(diào)用把函數(shù)調(diào)用作為一個(gè)語(yǔ)句不要求函數(shù)帶回明確返回值只完成一定操作#include<stdio.h>voidprintstar(){printf("*************\n");}voidprint_message(){printf("Howareyou!\n");}main(){printstar();print_message();printstar();}第25頁(yè)2.函數(shù)表示式調(diào)用以表示式形式出現(xiàn)在程序中要求函數(shù)必須帶回確定返回值c=2*max(a,b);3.函數(shù)參數(shù)調(diào)用作為參數(shù)出現(xiàn)在程序中要求函數(shù)必須帶回確定返回值m=max(a,max(b,c));第26頁(yè)函數(shù)調(diào)用過(guò)程1.依據(jù)函數(shù)名找到被調(diào)函數(shù),若沒(méi)找到,系統(tǒng)將匯報(bào)犯錯(cuò)信息;若找到,為形參開(kāi)辟存放空間;2.計(jì)算實(shí)參值。將實(shí)參值傳遞給形參;3.保護(hù)主調(diào)函數(shù)現(xiàn)場(chǎng),中止主調(diào)函數(shù),轉(zhuǎn)到被調(diào)函數(shù)函數(shù)體中開(kāi)始執(zhí)行;4.碰到return語(yǔ)句或函數(shù)結(jié)束花括號(hào)時(shí),返回主調(diào)函數(shù);5.釋放形參和調(diào)用函數(shù)中暫時(shí)變量?jī)?nèi)存空間;6.恢復(fù)現(xiàn)場(chǎng)從主調(diào)函數(shù)中止處繼續(xù)執(zhí)行。函數(shù)開(kāi)始調(diào)用函數(shù)結(jié)束調(diào)用第27頁(yè)#include<stdio.h>floataverage(floatx,floaty,floatz)
{floataver;aver=(x+y+z)/3;return(aver);}main(){floata,b,c,ave;a=6.5;b=4.2;c=25.3;
ave=average(a,b,c);
printf(“average=%f”,ave);}mainaverage12.0ave25.3c4.2b6.5aaver12.0z25.3y4.2x6.5第28頁(yè)函數(shù)之間位置關(guān)系在一個(gè)程序中有多個(gè)函數(shù),那么,各函數(shù)之間前后位置關(guān)系要求以下:
1、被調(diào)函數(shù)在前面,主調(diào)函數(shù)在后面.即先定義后調(diào)用。2、主調(diào)函數(shù)在前面,被調(diào)函數(shù)在后面。這時(shí),必須在調(diào)用語(yǔ)句之前,對(duì)被調(diào)用函數(shù)進(jìn)行原型申明(說(shuō)明),可在主調(diào)函數(shù)說(shuō)明部分,也可在程序開(kāi)始處說(shuō)明部分進(jìn)行。3、被調(diào)函數(shù)是庫(kù)函數(shù)或另一文件中自定義函數(shù),則在本程序文件起始部分用#include命令將對(duì)應(yīng)文件包含到本文件中來(lái)。第29頁(yè)intadd(intx,inty){return(x+y);}main(){inta=10,b=24,sum;printf("inputa,b:");sum=add(a,b);printf(”sum=%d\n",sum);}main(){inta=10,b=24,sum;
printf("inputa,b:");sum=add(a,b);printf(”sum=%d\n",sum);}intadd(intx,inty){return(x+y);}intadd(intx,inty);intadd(intx,inty);第30頁(yè)函數(shù)原型申明方法慣用是:用函數(shù)定義中函數(shù)首部,再加上一個(gè)分號(hào);也能夠省略函數(shù)首部中形參名,但必須保留形參類型。longfac();…
/*對(duì)除main之外全部自定義函數(shù)進(jìn)行原型說(shuō)明*/intcmn(intm,intn);main()/*main函數(shù)*/{intm,n,c;…}longfac(intx)/*fac函數(shù)*/{…}intcmn(intm,intn);/*cmn函數(shù)*/
{…}/*也能夠?qū)懗蒷ongfac(int);*//*也能夠?qū)懗蒳ntcmn(int,int);*/第31頁(yè)例:
longfac(intx);
/*函數(shù)原型說(shuō)明*/main(){intm,n,c;printf("inputm,n:");scanf("%d%d",&m,&n);if(m>n){c=fac(m)/(fac(n)*fac(m-n));/*三次調(diào)用*/printf("c(%d,%d)=%d\n",m,n,c);}elseprintf("inputdataerror\n");}longfac(intx){inti;longf=1;for(i=1;i<=x;i++)f=f*i;return(f);}第32頁(yè)數(shù)組作為函數(shù)參數(shù)
數(shù)組元素作函數(shù)實(shí)參
一維數(shù)組名作函數(shù)參數(shù)
多維數(shù)組名作函數(shù)參數(shù)第33頁(yè)例:計(jì)算數(shù)組中相鄰兩元素之間差值。數(shù)組元素作函數(shù)實(shí)參——值傳遞intdif(intx,inty){returnx-y;}main(){inti,a[4]={0,1,2,3};for(i=0;i<3;i++){printf("thediffbetween%dand%dis",i,i+1);
printf("%d\n",dif(a[i],a[i+1])
);}}thediffbetween0and1is-1thediffbetween1and2is-1thediffbetween2and3is-1第34頁(yè)數(shù)組名作函數(shù)參數(shù)——地址傳遞在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組,且類型應(yīng)一致。形參數(shù)組大小(多維數(shù)組第一維)可不指定,但[]不能省。編譯程序并不為形參數(shù)組分配空間。數(shù)組名表示數(shù)組在內(nèi)存中起始地址。第35頁(yè)例:從鍵盤輸入8學(xué)生成績(jī),編寫函數(shù)使用簡(jiǎn)
單項(xiàng)選擇擇排序?qū)⒊煽?jī)由高到低排序,并輸出成績(jī)。#defineN10voidSelectSort(inta[],intn);voidInputArray(inta[],intn);voidOutputArray(inta[],intn);main(){ intn=8,score[N];
InputArray(score,n); SelectSort(score,n); OutputArray(score,n);}第36頁(yè)voidInputArray(inta[],intn){ inti; printf("Input%dscores:\n",n); for(i=0;i<n;i++) scanf("%d",&a[i]);}voidOutputArray(inta[],intn){ inti; printf("Thesortedscores:\n"); for(i=0;i<n;i++) printf("%4d",a[i]);}第37頁(yè)voidSelectSort(inta[],intn){ inti,j,k,t; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) { if(a[k]<a[j]) k=j; } if(k!=i) { t=a[i];a[i]=a[k]; a[k]=t;} }}第38頁(yè)用數(shù)組名作函數(shù)參數(shù),應(yīng)該在主調(diào)函數(shù)和被調(diào)函數(shù)分別定義數(shù)組,不能只在一方定義;實(shí)參數(shù)組與形參數(shù)組類型應(yīng)一致;形參數(shù)組也能夠不指定大小,在定義數(shù)組時(shí)在數(shù)組名后面跟一個(gè)[];為了在被調(diào)用函數(shù)中處理數(shù)組元素需要,將數(shù)組個(gè)數(shù)作為一個(gè)參數(shù);用數(shù)組名作函數(shù)實(shí)參時(shí),不是把數(shù)組值傳遞給形參,而是把實(shí)參數(shù)組起始地址傳遞給形參數(shù)組,這么兩個(gè)數(shù)組就共占同一段內(nèi)存單元。說(shuō)明:第39頁(yè)例:求數(shù)組中全部元素最大值。intgetmax(intb[3][4])/*或intgetmax(intb[][4])*/{inti,j,max=b[0][0];for(i=0;i<3;i++);{for(j=0;j<4;j++)if(max<b[i][j])max=b[i][j];}returnmax;}main(){inta[3][4],i,j;printf(“\nEnter6integers:");for(i=0;i<3;i++)for(j=0;j<4;j++) scanf("%d",&a[i][j]);printf(“\nMax=%d”,getmax(a));}第40頁(yè)7.6函數(shù)嵌套與遞歸7.4.1函數(shù)嵌套調(diào)用
C語(yǔ)言函數(shù)定義都是相互平行、獨(dú)立,也就是說(shuō)在定義函數(shù)時(shí),一個(gè)函數(shù)內(nèi)不能包含另一個(gè)函數(shù)。
但可嵌套調(diào)用函數(shù),即在主調(diào)函數(shù)調(diào)用被調(diào)函數(shù)過(guò)程中,被調(diào)函數(shù)又調(diào)用了另一被調(diào)函數(shù)。
a函數(shù)main()調(diào)用函數(shù)a調(diào)用函數(shù)bb函數(shù)結(jié)束第41頁(yè)
圖示是兩層嵌套(連main函數(shù)共3層函數(shù)),其執(zhí)行過(guò)程是:
①執(zhí)行main函數(shù)開(kāi)頭部分;
②遇函數(shù)調(diào)用a操作語(yǔ)句,流程轉(zhuǎn)去a函數(shù);
③執(zhí)行a函數(shù)開(kāi)頭部分;
④遇調(diào)用b函數(shù)操作語(yǔ)句,流程轉(zhuǎn)去函數(shù)b;
⑤執(zhí)行b函數(shù),假如再無(wú)其它嵌套函數(shù),則完成b函數(shù)全部操作;
⑥返回調(diào)用b函數(shù)處,即返回a函數(shù);
⑦繼續(xù)執(zhí)行a函數(shù)中還未執(zhí)行部分,直到a函數(shù)結(jié)束;
⑧返回main函數(shù)中調(diào)用a函數(shù)處;
⑨繼續(xù)執(zhí)行main函數(shù)剩下部分直到結(jié)束。
第42頁(yè)例:求三個(gè)數(shù)中最大數(shù)和最小數(shù)差值。intdif(intx,inty,intz){return
max(x,y,z)-min(x,y,z);
}main(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);
d=dif(a,b,c);printf("Max-Min=%d\n",d);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}第43頁(yè)例:求圓環(huán)面積。#include<math.h>#definePI3.1415926floatarea_ring(floatx,floaty);floatarea(floatr);main(){floatr,r1;printf(“inputtowfigure:\n”);scanf(“%f%f”,&r,&r1);printf(“area_ringis%f”,area_ring(r,r1));}floatarea_ring(floatx,floaty){floatc;c=fabs(area(x)-area(y));return(c);}floatarea(floatr){return(PI*r*r);}
第44頁(yè)函數(shù)遞歸調(diào)用
在函數(shù)執(zhí)行過(guò)程中又直接或間接調(diào)用該函數(shù)本身
直接遞歸調(diào)用在函數(shù)中直接調(diào)用函數(shù)本身間接遞歸調(diào)用在函數(shù)中調(diào)用其它函數(shù),其它函數(shù)又調(diào)用原函數(shù)intf1(intx){inty,z;……
z=f2(y);…….return(2*z);}intf2(intt){inta,c;……
c=f1(a);…….return(3+c);}intf(intx){inty,z;……
z=f(y);…….return(2*z);}C編譯系統(tǒng)對(duì)遞歸函數(shù)自調(diào)用次數(shù)沒(méi)有限制。f()調(diào)f調(diào)f2調(diào)f1f1()f2()第45頁(yè)例:計(jì)算n!。分析:求解n階乘實(shí)際上有兩種方法,一個(gè)是連乘法,它基于階乘定義公式:
n!=1*2*3*…*n實(shí)現(xiàn)方法是用循環(huán)完成。第46頁(yè)另一個(gè)方法基于階乘遞歸定義公式:n!=1(n=0)n*(n-1)!(n>1)用函數(shù)直接遞歸調(diào)用實(shí)現(xiàn)main(){intn;longy;printf("\ninputaintegernumber:\n");scanf("%d",&n);
if(n<0)printf("dataerror\n");
else{y=fac(n);
printf("%d!=%ld",n,y);}}longfac(intn){longf;
if(n==0)f=1;elsef=n*fac(n-1);
return(f);}第47頁(yè)main()n=1n=2n=3n=4f=24f=6f=2f=1f=4*fac(3)f=3*fac(2)f=2*fac(1)f=1fac(4)注意:
在遞歸調(diào)用過(guò)程中,不一樣層同名局部變量是不一樣變成機(jī)器代碼后,執(zhí)行時(shí)相當(dāng)于將其拉成直線(線性程序代碼)。第一次調(diào)用fac第二次調(diào)用fac第三次調(diào)用fac第四次調(diào)用faclongfac(intn){return((n<=1)?1:fac(n-1)*n);}longfac(intn){longf;if(n<=1)f=1;elsef=fac(n-1)*n;return(f);}第48頁(yè)main(){intn;longy;printf("\ninputanintegernumber:\n");scanf("%d",&n);if(n<0)printf("dataerror\n");else{y=fac(4);
longfac(4) {longf; if(4<=1)f=1; elsef=fac(4-1)*4;
longfac(3) {longf; if(3<=1)f=1; elsef=fac(3-1)*3;
longfac(2){longf;if(2<=1)f=1;elsef=fac(2-1)*2; longfac(1) {longf; if(1<=1)f=1; else f=fac(n-1)*n; return(1); }
return(2);} return(6); }
return(24); } printf("%d!=%ld",n,y);}第49頁(yè)例:Hanoi塔問(wèn)題。一塊板上有三根桿,a,b,c。a桿上套有64個(gè)圓盤,大在下,小在上。要把這64個(gè)圓盤從a桿移動(dòng)c桿上,每次只能移動(dòng)一個(gè)圓盤,b桿能夠暫時(shí)存放。但在任何時(shí)候,任何桿上圓盤都必須保持大盤在下,小盤在上。第50頁(yè)將A塔上紅、黃兩盤移動(dòng)到B上藍(lán)盤放到C上將紅、黃兩盤從B移動(dòng)到C盤上。(完成)A問(wèn)題分析:n=1時(shí),直接將其從A--->C
;n>1時(shí),只要先將前n-1個(gè)借助C從A--->B,那么能夠把第n個(gè)直接從A--->C;將剩下n-1個(gè)借助A從B--->C,問(wèn)題性質(zhì)相同,所以適合采取遞歸過(guò)程!遞歸結(jié)束條件問(wèn)題分解BC第51頁(yè)設(shè)將n個(gè)盤從a借助b移到c桿算法為move(n,a,b,c),則:移動(dòng)盤子算法以下:①把a(bǔ)上面n-1個(gè)盤借助c移到b,記做
move(n-1,a,c,b);②把最下面1個(gè)盤從a直接移到c;③把b上n-1個(gè)盤借助a移到c,記做
move(n-1,b,a,c);顯然這是一個(gè)遞歸算法,按此算法編程以下:第52頁(yè)main(){intm;printf("\nInputnumber:");scanf("%d",&n);printf("thesteptomoving%2ddiskes:\n",m);
move(n,'a','b','c');}voidmove(intn,intx,inty,intz){if(n==1)printf("%c->%c\n",x,z);
else{move(n-1,x,z,y);printf("%c--->%c\n",x,z);move(n-1,y,x,z);}}第53頁(yè)…...move(3,'a','b','c');…...move(n,x,y,z);3,'a','b','c'n!=1move(n-1,x,z,y);printf("->",x,z);move(n-1,y,x,z);move(n,x,y,z);2,'a',‘c',‘b'n!=1move(n-1,x,z,y);printf("->",x,z);move(n-1,y,x,z);move(n,x,y,z);1,'a',‘b',‘c'2,'a',‘c',‘b'1,'a',‘b',‘c'n=1printf("->",x,z);1.a->c2.a->bmove(n,x,y,z);1,‘c',‘a(chǎn)',‘b'1,‘c',‘a(chǎn)',‘b'n=1printf("->",x,z);3.c->b4.a->cmove(n,x,y,z);2,‘b',‘a(chǎn)',‘c'2,‘b',‘a(chǎn)',‘c'n!=1move(n-1,x,z,y);printf("->",x,z);move(n-1,y,x,z);move(n,x,y,z);1,‘b',‘c',‘a(chǎn)'1,‘b',‘c',‘a(chǎn)'n=1printf("->",x,z);5.b->a6.b->cmove(n,x,y,z);1,‘a(chǎn)',‘b',‘c'1,‘a(chǎn)',‘b',‘c'n=1printf("->",x,z);7.a->c第54頁(yè)局部變量和全
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子商務(wù)增長(zhǎng)全球市場(chǎng)的未來(lái)趨勢(shì)與展望
- 物流市場(chǎng)中的大數(shù)據(jù)分析與決策支持
- 生物醫(yī)學(xué)工程與智能穿戴設(shè)備的結(jié)合
- 電商物流服務(wù)質(zhì)量的提升途徑研究
- 現(xiàn)代體育服務(wù)的市場(chǎng)分析與商業(yè)模式創(chuàng)新
- 現(xiàn)代服務(wù)業(yè)中的綠色發(fā)展趨勢(shì)
- 現(xiàn)代網(wǎng)絡(luò)安全編程技術(shù)概覽
- 電商巨頭引領(lǐng)下的網(wǎng)絡(luò)購(gòu)物市場(chǎng)成長(zhǎng)之路
- 電子商務(wù)物流的智能化與自動(dòng)化
- 物聯(lián)網(wǎng)時(shí)代的增值服務(wù)與電信業(yè)務(wù)模式變革
- 外出檢查病人突發(fā)呼吸心跳驟停應(yīng)急預(yù)案演練
- 《火力發(fā)電廠汽水管道設(shè)計(jì)規(guī)范+DLT+5054-2016》詳細(xì)解讀
- 幕墻施工成品及半成品保護(hù)措施
- 基于單片機(jī)的交通燈控制系統(tǒng)設(shè)計(jì)畢業(yè)論文
- 2024年執(zhí)業(yè)醫(yī)師考試-醫(yī)師定期考核(口腔)筆試參考題庫(kù)含答案
- 中國(guó)律師學(xué) 課件 陳衛(wèi)東 第10-17章 律師收費(fèi)制度-律師非訴訟業(yè)務(wù)(二)
- (高清版)TDT 1040-2013 土地整治項(xiàng)目制圖規(guī)范
- 中國(guó)移動(dòng)行測(cè)測(cè)評(píng)題及答案
- 精神科患者服藥依從性健康宣教
- 設(shè)備維保的維修流程與指導(dǎo)手冊(cè)
- 急性腎小球腎炎病人護(hù)理課件
評(píng)論
0/150
提交評(píng)論