2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩210頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第7章 用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計,7.1為什么要用函數(shù) 7.2怎樣定義函數(shù)7.3調(diào)用函數(shù)7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型7.5函數(shù)的嵌套調(diào)用 7.6函數(shù)的遞歸調(diào)用7.7數(shù)組作為函數(shù)參數(shù) 7.8局部變量和全局變量7.9變量的存儲方式和生存期7.10 關(guān)于變量的聲明和定義7.11 內(nèi)部函數(shù)和外部函數(shù),7.1為什么要用函數(shù),問題:如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫

2、在main函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,閱讀和維護(hù)變得困難有時程序中要多次實(shí)現(xiàn)某一功能,就需要多次重復(fù)編寫實(shí)現(xiàn)此功能的程序代碼,這使程序冗長,不精煉,7.1為什么要用函數(shù),解決的方法:用模塊化程序設(shè)計的思路采用“組裝”的辦法簡化程序設(shè)計的過程事先編好一批實(shí)現(xiàn)各種不同功能的函數(shù)把它們保存在函數(shù)庫中,需要時直接用,7.1為什么要用函數(shù),解決的方法:用模塊化程序設(shè)計的思路函數(shù)就是功能每一個函數(shù)用來實(shí)現(xiàn)一個特定的功能函數(shù)

3、的名字應(yīng)反映其代表的功能,7.1為什么要用函數(shù),在設(shè)計一個較大的程序時,往往把它分為若干個程序模塊,每一個模塊包括一個或多個函數(shù),每個函數(shù)實(shí)現(xiàn)一個特定的功能C程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次,7.1為什么要用函數(shù),main,a,b,c,f,g,h,d,e,i,e,7.1為什么要用函數(shù),可以使用庫函數(shù)可以使用自己編寫的函數(shù)在程序設(shè)計中要善于

4、利用函數(shù),可以減少重復(fù)編寫程序段的工作量,同時可以方便地實(shí)現(xiàn)模塊化的程序設(shè)計,7.1為什么要用函數(shù),例7.1 輸出以下的結(jié)果,用函數(shù)調(diào)用實(shí)現(xiàn)。 ****************** How do you do! ******************,7.1為什么要用函數(shù),解題思路:在輸出的文字上下分別有一行“*”號,顯然不必重復(fù)寫這段代碼,用一個函數(shù)print_star來實(shí)現(xiàn)輸出一行

5、“*”號的功能。再寫一個print_message函數(shù)來輸出中間一行文字信息用主函數(shù)分別調(diào)用這兩個函數(shù),#include int main(){ void print_star(); void print_message(); print_star(); print_message(); print_star(); return 0;},void

6、print_star(){ printf(“******************\n”); },void print_message() { printf(“ How do you do!\n”); },輸出16個*,輸出一行文字,#include int main(){ void print_star(); void print_message(); print_star();

7、print_message(); print_star(); return 0;},void print_star(){ printf(“******************\n”); },void print_message() { printf(“ How do you do!\n”); },,聲明函數(shù),,定義函數(shù),#include int main(){ void prin

8、t_star(); void print_message(); print_star(); print_message(); print_star(); return 0;},void print_star(){ printf(“******************\n”); },void print_message() { printf(“ H

9、ow do you do!\n”); },說明: (1) 一個C程序由一個或多個程序模塊組成,每一個程序模塊作為一個源程序文件。對較大的程序,一般不希望把所有內(nèi)容全放在一個文件中,而是將它們分別放在若干個源文件中,由若干個源程序文件組成一個C程序。這樣便于分別編寫、分別編譯,提高調(diào)試效率。一個源程序文件可以為多個C程序共用。,說明: (2) 一個源程序文件由一個或多個函數(shù)以及其他有關(guān)內(nèi)容(如預(yù)處理指令、數(shù)據(jù)聲明與定義等)組成。

10、一個源程序文件是一個編譯單位,在程序編譯時是以源程序文件為單位進(jìn)行編譯的,而不是以函數(shù)為單位進(jìn)行編譯的。,說明: (3) C程序的執(zhí)行是從main函數(shù)開始的,如果在main函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流程返回到main函數(shù),在main函數(shù)中結(jié)束整個程序的運(yùn)行。,說明: (4) 所有函數(shù)都是平行的,即在定義函數(shù)時是分別進(jìn)行的,是互相獨(dú)立的。一個函數(shù)并不從屬于另一個函數(shù),即函數(shù)不能嵌套定義。函數(shù)間可以互相調(diào)用,但不能調(diào)用main函數(shù)

11、。main函數(shù)是被操作系統(tǒng)調(diào)用的。,說明: (5) 從用戶使用的角度看,函數(shù)有兩種。庫函數(shù),它是由系統(tǒng)提供的,用戶不必自己定義而直接使用它們。應(yīng)該說明,不同的C語言編譯系統(tǒng)提供的庫函數(shù)的數(shù)量和功能會有一些不同,當(dāng)然許多基本的函數(shù)是共同的。用戶自己定義的函數(shù)。它是用以解決用戶專門需要的函數(shù)。,說明:(6) 從函數(shù)的形式看,函數(shù)分兩類。 ① 無參函數(shù)。無參函數(shù)一般用來執(zhí)行指定的一組操作。無參函數(shù)可以帶回或不帶回函數(shù)值,但一般以不帶

12、回函數(shù)值的居多。 ② 有參函數(shù)。在調(diào)用函數(shù)時,主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時,通過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù),一般情況下,執(zhí)行被調(diào)用函數(shù)時會得到一個函數(shù)值,供主調(diào)函數(shù)使用。,7.2 怎樣定義函數(shù),7.2.1 為什么要定義函數(shù)7.2.2 定義函數(shù)的方法,7.2.1 為什么要定義函數(shù),C語言要求,在程序中用到的所有函數(shù),必須“先定義,后使用”指定函數(shù)名字、函數(shù)返回值類型、函數(shù)實(shí)現(xiàn)的功能以及參數(shù)的個數(shù)與類型,將這些信息通知編譯系統(tǒng)。,7.2

13、.1 為什么要定義函數(shù),指定函數(shù)的名字,以便以后按名調(diào)用指定函數(shù)類型,即函數(shù)返回值的類型指定函數(shù)參數(shù)的名字和類型,以便在調(diào)用函數(shù)時向它們傳遞數(shù)據(jù)指定函數(shù)的功能。這是最重要的,這是在函數(shù)體中解決的,7.2.1 為什么要定義函數(shù),對于庫函數(shù),程序設(shè)計者只需用#include指令把有關(guān)的頭文件包含到本文件模塊中即可程序設(shè)計者需要在程序中自己定義想用的而庫函數(shù)并沒有提供的函數(shù),7.2.2 定義函數(shù)的方法,1.定義無參函數(shù)定義無參函數(shù)的

14、一般形式為:,類型名 函數(shù)名(void) { 函數(shù)體 },類型名 函數(shù)名() { 函數(shù)體 },包括聲明部分和語句部分,包括聲明部分和語句部分,7.2.2 定義函數(shù)的方法,1.定義無參函數(shù)定義無參函數(shù)的一般形式為:,類型名 函

15、數(shù)名(void) { 函數(shù)體 },類型名 函數(shù)名() { 函數(shù)體 },指定函數(shù)值的類型,指定函數(shù)值的類型,7.2.2 定義函數(shù)的方法,2.定義有參函數(shù)定義有參函數(shù)的一般形式為:類型名 函數(shù)名(形式參數(shù)表列){ 函

16、數(shù)體 },7.2.2 定義函數(shù)的方法,3. 定義空函數(shù)定義空函數(shù)的一般形式為:類型名 函數(shù)名( ){ }先用空函數(shù)占一個位置,以后逐步擴(kuò)充好處:程序結(jié)構(gòu)清楚,可讀性好,以后擴(kuò)充新功能方便,對程序結(jié)構(gòu)影響不大,7.3 調(diào)用函數(shù),7.3.1函數(shù)調(diào)用的形式7.3.2函數(shù)調(diào)用時的數(shù)據(jù)傳遞7.3.3函數(shù)調(diào)用的過程7.3.4函數(shù)的返回值,7.3.1函數(shù)調(diào)用的形式,函數(shù)調(diào)用的一般形式為: 函數(shù)名

17、(實(shí)參表列)如果是調(diào)用無參函數(shù),則“實(shí)參表列”可以沒有,但括號不能省略如果實(shí)參表列包含多個實(shí)參,則各參數(shù)間用逗號隔開,7.3.1函數(shù)調(diào)用的形式,按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置來分,可以有以下3種函數(shù)調(diào)用方式:1. 函數(shù)調(diào)用語句把函數(shù)調(diào)用單獨(dú)作為一個語句 如printf_star();這時不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作,7.3.1函數(shù)調(diào)用的形式,按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置來分,可以有以下3種函數(shù)調(diào)

18、用方式:2. 函數(shù)表達(dá)式函數(shù)調(diào)用出現(xiàn)在另一個表達(dá)式中 如c=max(a,b);這時要求函數(shù)帶回一個確定的值以參加表達(dá)式的運(yùn)算,7.3.1函數(shù)調(diào)用的形式,按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置來分,可以有以下3種函數(shù)調(diào)用方式:3. 函數(shù)參數(shù)函數(shù)調(diào)用作為另一函數(shù)調(diào)用時的實(shí)參 如m=max(a,max(b,c));其中max(b,c)是一次函數(shù)調(diào)用,它的值作為max另一次調(diào)用的實(shí)參,7.3.2 函數(shù)調(diào)用時的數(shù)據(jù)傳遞,1

19、.形式參數(shù)和實(shí)際參數(shù)在調(diào)用有參函數(shù)時,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系定義函數(shù)時函數(shù)名后面的變量名稱為“形式參數(shù)”(簡稱“形參”)主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面參數(shù)稱為“實(shí)際參數(shù)”(簡稱“實(shí)參”) 實(shí)際參數(shù)可以是常量、變量或表達(dá)式,7.3.2 函數(shù)調(diào)用時的數(shù)據(jù)傳遞,2. 實(shí)參和形參間的數(shù)據(jù)傳遞在調(diào)用函數(shù)過程中,系統(tǒng)會把實(shí)參的值傳遞給被調(diào)用函數(shù)的形參或者說,形參從實(shí)參得到一個值該值在函數(shù)調(diào)用期間有效,可以參加被調(diào)

20、函數(shù)中的運(yùn)算,7.3.2 函數(shù)調(diào)用時的數(shù)據(jù)傳遞,例7.2 輸入兩個整數(shù),要求輸出其中值較大者。要求用函數(shù)來找到大數(shù)。解題思路:(1)函數(shù)名應(yīng)是見名知意,今定名為max(2) 由于給定的兩個數(shù)是整數(shù),返回主調(diào)函數(shù)的值(即較大數(shù))應(yīng)該是整型(3)max函數(shù)應(yīng)當(dāng)有兩個參數(shù),以便從主函數(shù)接收兩個整數(shù),因此參數(shù)的類型應(yīng)當(dāng)是整型,7.3.2 函數(shù)調(diào)用時的數(shù)據(jù)傳遞,先編寫max函數(shù):int max(int x,int y){ i

21、nt z; z=x>y?x:y; return(z); },7.3.2 函數(shù)調(diào)用時的數(shù)據(jù)傳遞,在max函數(shù)上面,再編寫主函數(shù)#include int main(){ int max(int x,int y); int a,b,c; printf(“two integer numbers: "); scanf(“%d,%d”,&a,&b);

22、c=max(a,b); printf(“max is %d\n”,c); },實(shí)參可以是常量、變量或表達(dá)式,,7.3.2 函數(shù)調(diào)用時的數(shù)據(jù)傳遞,c=max(a,b); (main函數(shù))int max(int x, int y) (max函數(shù)){ int z; z=x>y?x:y; return(z); },,7.3.3 函數(shù)調(diào)用的過程,在定義函數(shù)中指定的形參,在未出現(xiàn)

23、函數(shù)調(diào)用時,它們并不占內(nèi)存中的存儲單元。在發(fā)生函數(shù)調(diào)用時,函數(shù)max的形參被臨時分配內(nèi)存單元。,2,a,3,b,,x,,y,2,3,實(shí)參,形參,7.3.3 函數(shù)調(diào)用的過程,調(diào)用結(jié)束,形參單元被釋放實(shí)參單元仍保留并維持原值,沒有改變?nèi)绻趫?zhí)行一個被調(diào)用函數(shù)時,形參的值發(fā)生改變,不會改變主調(diào)函數(shù)的實(shí)參的值,2,a,3,b,,x,,y,2,3,實(shí)參,形參,7.3.4. 函數(shù)的返回值,通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個確定的值,這就

24、是函數(shù)值(函數(shù)的返回值)函數(shù)的返回值是通過函數(shù)中的return語句獲得的。一個函數(shù)中可以有一個以上的return語句,執(zhí)行到哪一個return語句,哪一個就起作用return語句后面的括號可以不要,7.3.4. 函數(shù)的返回值,通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個確定的值,這就是函數(shù)值(函數(shù)的返回值)(2) 函數(shù)值的類型。應(yīng)當(dāng)在定義函數(shù)時指定函數(shù)值的類型,7.3.4. 函數(shù)的返回值,通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個

25、確定的值,這就是函數(shù)值(函數(shù)的返回值)(3)在定義函數(shù)時指定的函數(shù)類型一般應(yīng)該和return語句中的表達(dá)式類型一致如果函數(shù)值的類型和return語句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn),7.3.4. 函數(shù)的返回值,例7.3將例7.2稍作改動,將在max函數(shù)中定義的變量z改為float型。函數(shù)返回值的類型與指定的函數(shù)類型不同,分析其處理方法。解題思路:如果函數(shù)返回值的類型與指定的函數(shù)類型不同,按照賦值規(guī)則處理。,#include

26、int main() { int max(float x,float y); float a,b; int c; scanf("%f,%f,",&a,&b); c=max(a,b); printf("max is %d\n",c); return 0; }int max(float x,float y) { float z;

27、 z=x>y?x:y; return( z ) ;},1.5,2.6,2.6,,2,,變?yōu)?,7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型,在一個函數(shù)中調(diào)用另一個函數(shù)需要具備如下條件:(1) 被調(diào)用函數(shù)必須是已經(jīng)定義的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))(2) 如果使用庫函數(shù),應(yīng)該在本文件開頭加相應(yīng)的#include指令(3

28、) 如果使用自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)后面,應(yīng)該聲明,7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型,例7.4 輸入兩個實(shí)數(shù),用一個函數(shù)求出它們之和。解題思路:用add函數(shù)實(shí)現(xiàn)。首先要定義add函數(shù),它為float型,它應(yīng)有兩個參數(shù),也應(yīng)為float型。特別要注意的是:要對add函數(shù)進(jìn)行聲明。,7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型,分別編寫add函數(shù)和main函數(shù),它們組成一個源程序文件main函數(shù)的位置在add函數(shù)之前在ma

29、in函數(shù)中對add函數(shù)進(jìn)行聲明,#include int main(){ float add(float x, float y); float a,b,c; printf("Please enter a and b:"); scanf("%f,%f",&a,&b); c=add(a,b);

30、 printf("sum is %f\n",c); return 0;},float add(float x,float y){ float z; z=x+y; return(z); },求兩個實(shí)數(shù)之和,函數(shù)值也是實(shí)型,對add函數(shù)聲明,#include i

31、nt main(){ float add(float x, float y); float a,b,c; printf("Please enter a and b:"); scanf("%f,%f",&a,&b); c=add(a,b); printf(&q

32、uot;sum is %f\n",c); return 0;},float add(float x,float y){ float z; z=x+y; return(z); },只差一個分號,,#include int main(){ float add(float x, float y);

33、 float a,b,c; printf("Please enter a and b:"); scanf("%f,%f",&a,&b); c=add(a,b); printf("sum is %f\n",c); return 0;},

34、float add(float x,float y){ float z; z=x+y; return(z); },定義add函數(shù),調(diào)用add函數(shù),函數(shù)原型的一般形式有兩種:如 float add(float x, float y); float add(float, float);原型說明可以放在文件的開頭,這

35、時所有函數(shù)都可以使用此函數(shù),7.5 函數(shù)的嵌套調(diào)用,C語言的函數(shù)定義是互相平行、獨(dú)立的即函數(shù)不能嵌套定義但可以嵌套調(diào)用函數(shù)即調(diào)用一個函數(shù)的過程中,又可以調(diào)用另一個函數(shù),7.5 函數(shù)的嵌套調(diào)用,main函數(shù),①,調(diào)用a函數(shù),⑨,結(jié)束,a函數(shù),③,調(diào)用b函數(shù),⑦,②,⑧,b函數(shù),⑤,④,⑥,7.5 函數(shù)的嵌套調(diào)用,例7.5 輸入4個整數(shù),找出其中最大的數(shù)。用函數(shù)的嵌套調(diào)用來處理。解題思路:main中調(diào)用max4函數(shù),找4個數(shù)中最大

36、者max4中再調(diào)用max2,找兩個數(shù)中的大者max4中多次調(diào)用max2,可找4個數(shù)中的大者,然后把它作為函數(shù)值返回main函數(shù)main函數(shù)中輸出結(jié)果,#include int main(){ int max4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:"); scanf("%d%d%

37、d%d",&a,&b,&c,&d); max=max4(a,b,c,d); printf("max=%d \n",max); return 0;},主函數(shù),對max4 函數(shù)聲明,#include int main(){ int max4(int a,int b,int c,int d); int a,b,c,

38、d,max; printf(“4 interger numbers:"); scanf("%d%d%d%d",&a,&b,&c,&d); max=max4(a,b,c,d); printf("max=%d \n",max); return 0;},主函數(shù),輸入4個整數(shù),#inclu

39、de int main(){ int max4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:"); scanf("%d%d%d%d",&a,&b,&c,&d); max=max4(a,b,c,d); prin

40、tf("max=%d \n",max); return 0;},主函數(shù),調(diào)用后肯定是4個數(shù)中最大者,輸出最大者,int max4(int a,int b,int c,int d){ int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,

41、d); return(m); },max4函數(shù),對max2 函數(shù)聲明,int max4(int a,int b,int c,int d){ int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); r

42、eturn(m); },max4函數(shù),a,b中較大者,a,b,c中較大者,a,b,c,d中最大者,int max4(int a,int b,int c,int d){ int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); ret

43、urn(m); },max4函數(shù),int max2(int a,int b) { if(a>=b) return a; else return b; },max2函數(shù),找a,b中較大者,int max4(int a,int b,int c,int d){ int max2(int a,int b); int m; m=max2(a,b);

44、 m=max2(m,c); m=max2(m,d); return(m); },max4函數(shù),int max2(int a,int b) { if(a>=b) return a; else return b; },max2函數(shù),return(a>b?a:b);,,

45、int max4(int a,int b,int c,int d){ int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); },max4函數(shù),int max2(int a,int b) { retur

46、n(a>b?a:b); },int max4(int a,int b,int c,int d){ int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); },max4函數(shù),m=max2(max2(a

47、,b),c);,,int max2(int a,int b) { return(a>b?a:b); },int max4(int a,int b,int c,int d){ int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d);

48、 return(m); },max4函數(shù),m=max2(max2(max2(a,b),c),d);,,int max2(int a,int b) { return(a>b?a:b); },int max4(int a,int b,int c,int d){ int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c);

49、 m=max2(m,d); return(m); },max4函數(shù),ruturn max2(max2(max2(a,b),c),d);,,int max2(int a,int b) { return(a>b?a:b); },int max4(int a,int b,int c,int d){ int max2(int a,int b

50、); ruturn max2(max2(max2(a,b),c),d);},int max2(int a,int b) { return(a>b?a:b); },#include int main(){ …… max=max4(a,b,c,d); ……},7.6 函數(shù)的遞歸調(diào)用,在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。C語言的特點(diǎn)之一就在于允許函數(shù)

51、的遞歸調(diào)用。,f2函數(shù)調(diào)用f1函數(shù),7.6 函數(shù)的遞歸調(diào)用,int f(int x){ int y,z; z=f(y); return (2*z);},f函數(shù)調(diào)用f函數(shù),f1函數(shù)調(diào)用f2函數(shù),應(yīng)使用if語句控制結(jié)束調(diào)用,直接調(diào)用本函數(shù),間接調(diào)用本函數(shù),7.6 函數(shù)的遞歸調(diào)用,例7.6 有5個學(xué)生坐在一起問第5個學(xué)生多少歲?他說比第4個學(xué)生大2歲問第4個學(xué)生歲

52、數(shù),他說比第3個學(xué)生大2歲問第3個學(xué)生,又說比第2個學(xué)生大2歲問第2個學(xué)生,說比第1個學(xué)生大2歲最后問第1個學(xué)生,他說是10歲請問第5個學(xué)生多大,7.6 函數(shù)的遞歸調(diào)用,解題思路:要求第5個年齡,就必須先知道第4個年齡要求第4個年齡必須先知道第3個年齡第3個年齡又取決于第2個年齡第2個年齡取決于第1個年齡每個學(xué)生年齡都比其前1個學(xué)生的年齡大2,7.6 函數(shù)的遞歸調(diào)用,解題思路:age(5)=age(4)+2age(

53、4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10,,,age(5)=age(4)+2,age(4)=age(3)+2,age(3)=age(2)+2,age(2)=age(1)+2,age(1) =10,age(2) =12,age(3) =14,age(4) =16,age(5) =18,回溯階段,遞推階段,age(5)=age(4)

54、+2,age(4)=age(3)+2,age(3)=age(2)+2,age(2)=age(1)+2,age(1) =10,age(2) =12,age(3) =14,age(4) =16,age(5) =18,回溯階段,遞推階段,結(jié)束遞歸的條件,,#include int main(){ int age(int n); printf("NO.5,age:%d\n",

55、age(5)); return 0;}  int age(int n) { int c; if(n==1) c=10; else c=age(n-1)+2; return(c); },,age(5)輸出age(5),main,c=age(4)+2,age函數(shù)n=5,c=age(3)+2,age函數(shù)n=4,c=age(1)+2,age函

56、數(shù)n=2,c=age(2)+2,age函數(shù)n=3,c=10,age函數(shù)n=1,age(1)=10,age(2)=12,age(3)=14,age(4)=16,age(5)=18,18,例7.7 用遞歸方法求n!。解題思路:求n!可以用遞推方法:即從1開始,乘2,再乘3……一直乘到n。遞推法的特點(diǎn)是從一個已知的事實(shí)(如1!=1)出發(fā),按一定規(guī)律推出下一個事實(shí)(如2!=1!*2),再從這個新的已知的事實(shí)出發(fā),再向下推出一個新的事

57、實(shí)(3!=3*2!)。n!=n*(n-1)!。,例7.7 用遞歸方法求n!。解題思路:求n!也可以用遞歸方法,即5!等于4!×5,而4?。剑?!×4…,1?。剑笨捎孟旅娴倪f歸公式表示:,,#include int main() {int fac(int n); int n; int y; printf("input an integer number:"); scanf(&

58、quot;%d",&n); y=fac(n); printf("%d!=%d\n",n,y); return 0;},int fac(int n) { int f; if(n<0) printf("n<0,data error!"); else if(n==0 | | n==1)

59、 f=1; else f=fac(n-1)*n; return(f); },注意溢出,,fac(5)輸出fac(5),main,f=fac(4)×5,fac函數(shù)n=5,f=fac(3)×4,fac函數(shù)n=4,f=fac(1)×2,fac函數(shù)n=2,f=fac(2)×3,fac函數(shù)n=3,f=1,fac函數(shù)n=1,fac(1)=1,fac(2)=2,fac(3)

60、=6,fac(4)=24,fac(5)=120,120,例7.8 Hanoi(漢諾)塔問題。古代有一個梵塔,塔內(nèi)有3個座A、B、C,開始時A座上有64個盤子,盤子大小不等,大的在下,小的在上。有一個老和尚想把這64個盤子從A座移到C座,但規(guī)定每次只允許移動一個盤,且在移動過程中在3個座上都始終保持大盤在下,小盤在上。在移動過程中可以利用B座。要求編程序輸出移動一盤子的步驟。,解題思路:要把64個盤子從A座移動到C座,需要移動大約264

61、 次盤子。一般人是不可能直接確定移動盤子的每一個具體步驟的老和尚會這樣想:假如有另外一個和尚能有辦法將上面63個盤子從一個座移到另一座。那么,問題就解決了。此時老和尚只需這樣做:,解題思路:(1) 命令第2個和尚將63個盤子從A座移到B座(2) 自己將1個盤子(最底下的、最大的盤子)從A座移到C座(3) 再命令第2個和尚將63個盤子從B座移到C座,A,B,C,,,……,,,將63個從A到B,第1個和尚的做法,A,B,C,,將63

62、個從A到B,第1個和尚的做法,A,B,C,,將1個從A到C,第1個和尚的做法,A,B,C,,將1個從A到C,第1個和尚的做法,A,B,C,,將63個從B到C,第1個和尚的做法,A,B,C,,將63個從B到C,第1個和尚的做法,A,B,C,,,……,,,將62個從A到C,第2個和尚的做法,A,B,C,,,將62個從A到C,第2個和尚的做法,A,B,C,,,將1個從A到B,第2個和尚的做法,A,B,C,,,將1個從A到B,第2個和尚的做法,

63、A,B,C,,,將62個從C到B,第2個和尚的做法,A,B,C,,,將62個從C到B,第2個和尚的做法,第3個和尚的做法第4個和尚的做法第5個和尚的做法第6個和尚的做法第7個和尚的做法……第63個和尚的做法,第64個和尚僅做:將1個從A移到C,A,B,C,,,,將3個盤子從A移到C的全過程,將2個盤子從A移到B,A,B,C,,將3個盤子從A移到C的全過程,將2個盤子從A移到B,,A,B,C,,,將3個盤子從A移到C的全過程,

64、將1個盤子從A移到C,A,B,C,,,,將3個盤子從A移到C的全過程,將1個盤子從A移到C,,,A,B,C,,將3個盤子從A移到C的全過程,將2個盤子從B移到C,A,B,C,,將3個盤子從A移到C的全過程,將2個盤子從B移到C,A,B,C,,,,將2個盤子從A移到B的過程,將1個盤子從A移到C,A,B,C,,,,將2個盤子從A移到B的過程,將1個盤子從A移到C,A,B,C,,,,將2個盤子從A移到B的過程,將1個盤子從A移到B,A,B,

65、C,,,,將2個盤子從A移到B的過程,將1個盤子從A移到B,A,B,C,,,,將2個盤子從A移到B的過程,將1個盤子從C移到B,A,B,C,,,,將2個盤子從A移到B的過程,將1個盤子從C移到B,,,A,B,C,,將2個盤子從B移到C的過程,,,A,B,C,,將2個盤子從B移到C的過程,,,A,B,C,,將2個盤子從B移到C的過程,,,A,B,C,,將2個盤子從B移到C的過程,由上面的分析可知:將n個盤子從A座移到C座可以分解為以下3個

66、步驟:(1) 將A上n-1個盤借助C座先移到B座上(2) 把A座上剩下的一個盤移到C座上(3) 將n-1個盤從B座借助于A座移到C座上,可以將第(1)步和第(3)步表示為:將“one”座上n-1個盤移到“two”座(借助“three”座)。在第(1)步和第(3)步中,one 、two、three和A、B、C的對應(yīng)關(guān)系不同。對第(1)步,對應(yīng)關(guān)系是one對應(yīng)A,two對應(yīng)B,three對應(yīng)C。對第(3)步,對應(yīng)關(guān)系是one對

67、應(yīng)B,two對應(yīng)C,three對應(yīng)A。,把上面3個步驟分成兩類操作:(1) 將n-1個盤從一個座移到另一個座上(n>1)。這就是大和尚讓小和尚做的工作,它是一個遞歸的過程,即和尚將任務(wù)層層下放,直到第64個和尚為止。(2) 將1個盤子從一個座上移到另一座上。這是大和尚自己做的工作。,編寫程序。用hanoi函數(shù)實(shí)現(xiàn)第1類操作(即模擬小和尚的任務(wù))用move函數(shù)實(shí)現(xiàn)第2類操作(模擬大和尚自己移盤)函數(shù)調(diào)用hanoi(n,one,t

68、wo.three)表示將n個盤子從“one”座移到“three”座的過程(借助“two”座)函數(shù)調(diào)用move(x,y)表示將1個盤子從x 座移到y(tǒng) 座的過程。x和y是代表A、B、C座之一,根據(jù)每次不同情況分別取A、B、C代入,#include int main(){ void hanoi(int n,char one, char two,char three); int

69、m; printf(“the number of diskes:"); scanf("%d",&m); printf("move %d diskes:\n",m); hanoi(m,'A','B','C');},void hanoi(int n,char one,char two,

70、 char three) { void move(char x,char y); if(n==1) move(one,three); else { hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論