版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
引言C程序由主函數(shù)main和其他函數(shù)構(gòu)成格式化輸出:printf格式化輸入:scanf計(jì)算x的y次冪:pow...西安電子科技大學(xué)計(jì)算機(jī)學(xué)院1標(biāo)準(zhǔn)函數(shù)有限,需求無限intmain(){...
return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院2為什么要定義函數(shù)例:求一些圓盤的面積,圓盤半徑分別為:3.24、2.13、0.865、3.746、12.3364、8.421//設(shè)圓周率為3.1416,可寫出下面程序:#include<stdio.h>intmain(){printf("r=%f,s=%f\n",3.24,3.24*3.24*3.1416);printf("r=%f,s=%f\n",2.13,2.13*2.12*3.1415);…}繁瑣的東西很容易出錯(cuò),并且不易修改西安電子科技大學(xué)計(jì)算機(jī)學(xué)院3為什么要定義函數(shù)如果有求圓面積的函數(shù):doublec_area(doubler)如果有打印圓面積的函數(shù):pc_area(doubler)intmain(){printf("r=%f,s=%f\n",3.24,c_area(3.24));printf("r=%f,s=%f\n",2.13,c_area(2.13));…}★函數(shù)能使源程序變短,變得易寫/易理解/易修改intmain(){
pc_area(3.24);
pc_area(2.13);…}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院4為什么要定義函數(shù)半徑3.24高2.4的圓錐體積:外半徑5.3,內(nèi)半徑3.07,高4.2的空心圓柱體積:2.4*c_area(3.24)/3.0
(c_area(5.3)-c_area(3.07))*4.2★函數(shù)能使代碼共享變得容易西安電子科技大學(xué)計(jì)算機(jī)學(xué)院5目標(biāo)學(xué)會把常用的代碼定義為函數(shù)學(xué)會在程序中使用函數(shù)掌握C語言提供的常用庫函數(shù)了解遞歸的基本原理西安電子科技大學(xué)計(jì)算機(jī)學(xué)院6主要內(nèi)容函數(shù)定義函數(shù)調(diào)用C語言常用函數(shù)函數(shù)與遞歸變量作用域西安電子科技大學(xué)計(jì)算機(jī)學(xué)院74.1函數(shù)定義西安電子科技大學(xué)計(jì)算機(jī)學(xué)院8函數(shù)定義把一段計(jì)算定義成函數(shù)并給以命名,定義后就可以在任何需要該函數(shù)的地方通過函數(shù)名調(diào)用。doublec_area(doubler){returnr*r*3.1416;}intmain(){doublev=2.4*c_area(3.24)/3.0;}定義計(jì)算圓面積的函數(shù)c_area使用圓面積函數(shù)c_area來計(jì)算體積
函數(shù)頭函數(shù)名:使用函數(shù)需要的名稱,合法標(biāo)識符返回值類型:函數(shù)計(jì)算結(jié)果的數(shù)據(jù)類型參數(shù)表:完成計(jì)算需要的數(shù)據(jù)(數(shù)量和類型)函數(shù)體實(shí)現(xiàn)函數(shù)功能的代碼,由一對大括號包圍9定義函數(shù)的要素doublec_area(doubler)
{returnr*r*3.1416;}返回值類型函數(shù)名參數(shù)表函數(shù)體函數(shù)頭函數(shù)返回值函數(shù)返回值表示函數(shù)內(nèi)代碼計(jì)算的結(jié)果一個(gè)函數(shù)最多只能有一個(gè)返回值,通過return語句返回,由調(diào)用者使用return語句形式:return表達(dá)式;西安電子科技大學(xué)計(jì)算機(jī)學(xué)院10doublec_area(doubler){
returnr*r*3.1416;}intmain(){doublev=2.4*c_area(3.24)/3.0;}計(jì)算結(jié)果返回給調(diào)用者使用西安電子科技大學(xué)計(jì)算機(jī)學(xué)院11函數(shù)返回值如果函數(shù)有返回值則必須指定返回值類型,如果函數(shù)不需要返回值必須使用void作為函數(shù)返回值類型。返回值類型為void時(shí),不需要return語句或者寫成return;voidpc_area(doubler){//沒有返回值的函數(shù)
printf("r=%f,s=%f\n",r,3.14159265*r*r);}doublec_area(doubler){//有返回值的函數(shù)
returnr*r*3.1416;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院12函數(shù)返回值一個(gè)函數(shù)中可以有多條return語句,但只會執(zhí)行其中一條。函數(shù)返回值通過return語句返回,return語句一旦執(zhí)行,整個(gè)函數(shù)就結(jié)束。intmax(inta,intb){
if(a>b)returna;
returnb;}intcompare(intx,inty){if(x==y)return0;elseif(x>y)return1;elsereturn-1;}函數(shù)返回值的用處用來給變量賦值參與表達(dá)式運(yùn)算13intmain(){doublev=2.4*c_area(3.24)/3.0;printf("v=%f\n",v);}intmain(){doubles=c_area(3.24);
doublev=2.4*s/3.0;printf("v=%f\n",v);}需要注意返回值類型為void的函數(shù)不能放在表達(dá)式中參與運(yùn)算函數(shù)返回值可以用來判斷函數(shù)執(zhí)行過程是否有誤函數(shù)返回值的用處14intmain(){inta,b;printf(“pleaseinput2integers\n”);if(scanf(“%d%d”,&a,&b)!=2)printf(“inputerror\n”);elseprintf(“a=%d,b=%d\n”,a,b);}scanf函數(shù)的返回值表示正確讀入的數(shù)據(jù)數(shù)量西安電子科技大學(xué)計(jì)算機(jī)學(xué)院15函數(shù)參數(shù)表函數(shù)可以有0個(gè)或多個(gè)參數(shù),這些參數(shù)稱為形式參數(shù)每個(gè)參數(shù)必須指明類型和參數(shù)名稱函數(shù)參數(shù)是函數(shù)內(nèi)的局部變量,只在函數(shù)體內(nèi)有效函數(shù)參數(shù)只有在函數(shù)被調(diào)用時(shí)才有效函數(shù)參數(shù)的初始值由調(diào)用者傳入(將實(shí)際參數(shù)以值拷貝的方式傳入)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院16形參和實(shí)參形參:在函數(shù)定義中括號內(nèi)的標(biāo)識符,與函數(shù)調(diào)用時(shí)的實(shí)參一一對應(yīng)實(shí)參:在調(diào)用函數(shù)的括號中使用的表達(dá)式,它的值被傳入函數(shù)并賦值給函數(shù)的對應(yīng)形參。西安電子科技大學(xué)計(jì)算機(jī)學(xué)院17形參和實(shí)參#include<stdio.h>//定義函數(shù)doublec_area(doubler
){returnr*r*3.1416;}intmain(){doublev,radius=3.24;//調(diào)用函數(shù)v=2.4*c_area(radius)/3.0;return0;}形參實(shí)參函數(shù)調(diào)用時(shí),實(shí)參radius的值(3.24)傳遞給形參r西安電子科技大學(xué)計(jì)算機(jī)學(xué)院184.2函數(shù)調(diào)用如何調(diào)用自定義函數(shù)如何調(diào)用系統(tǒng)函數(shù)函數(shù)調(diào)用過程函數(shù)調(diào)用的參數(shù)傳遞機(jī)制西安電子科技大學(xué)計(jì)算機(jī)學(xué)院19調(diào)用自定義函數(shù)方法1函數(shù)定義放在調(diào)用函數(shù)之前在需要的地方調(diào)用函數(shù),傳入類型和數(shù)量正確的實(shí)際參數(shù),函數(shù)返回值可以作為表達(dá)式的一部分#include<stdio.h>//函數(shù)定義doublec_area(doubler){returnr*r*3.1416;}intmain(){doublev;
//函數(shù)調(diào)用v=2.4*c_area(3.24)/3.0;
return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院20調(diào)用自定義函數(shù)方法2函數(shù)定義放在調(diào)用函數(shù)之后在函數(shù)調(diào)用之前給出函數(shù)聲明在需要的地方調(diào)用函數(shù),傳入類型和數(shù)量正確的實(shí)際參數(shù),函數(shù)返回值可以作為表達(dá)式的一部分#include<stdio.h>//函數(shù)聲明doublec_area(doubler);intmain(){doublev;
//函數(shù)調(diào)用v=2.4*c_area(3.24)/3.0;return0;}//函數(shù)定義doublec_area(doubler){returnr*r*3.1416;}調(diào)用自定義函數(shù)方法2函數(shù)聲明就是函數(shù)頭(函數(shù)名稱,返回值類型,參數(shù)數(shù)量、參數(shù)類型)加上分號,其作用是告訴編譯器函數(shù)應(yīng)該以什么形式調(diào)用,編譯器用函數(shù)聲明來檢查函數(shù)調(diào)用是否正確。西安電子科技大學(xué)計(jì)算機(jī)學(xué)院21//函數(shù)聲明doublec_area(doubler);//函數(shù)聲明doublec_area(double);西安電子科技大學(xué)計(jì)算機(jī)學(xué)院22調(diào)用系統(tǒng)函數(shù)包含必要的頭文件,其本質(zhì)是將函數(shù)聲明添加到程序中在需要的地方調(diào)用函數(shù),傳入類型和數(shù)量正確的實(shí)際參數(shù),函數(shù)返回值可以作為表達(dá)式的一部分#include<stdio.h>#include<math.h>intmain(){doublesum=0;intn=1;while(n<=100){sum=sum+sin(1.0/n);
n=n+1;}
printf("sum=%f\n",sum);return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院23函數(shù)調(diào)用的若干問題C程序是由函數(shù)構(gòu)成的,主函數(shù)main是程序入口,由系統(tǒng)調(diào)用所有可執(zhí)行語句都必須放在某個(gè)函數(shù)體內(nèi)調(diào)用函數(shù)的函數(shù)稱為主調(diào)函數(shù),被調(diào)用的函數(shù)稱為被調(diào)函數(shù)當(dāng)函數(shù)調(diào)用發(fā)生時(shí),主調(diào)函數(shù)暫停,程序控制轉(zhuǎn)入被調(diào)函數(shù),被調(diào)函數(shù)執(zhí)行結(jié)束后,主調(diào)函數(shù)繼續(xù)(堆棧)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院24函數(shù)調(diào)用的若干問題#include<stdio.h>#include<math.h>doublec_area(doubler){returnpow(r,2)*3.1416;}intmain(){doublev;v=2.4*c_area(3.24)/3.0;return0;}main函數(shù)c_area函數(shù)pow函數(shù)c_area(3.24)pow(r,2)調(diào)用調(diào)用返回返回函數(shù)調(diào)用的若干問題西安電子科技大學(xué)計(jì)算機(jī)學(xué)院25西安電子科技大學(xué)計(jì)算機(jī)學(xué)院26參數(shù)傳遞機(jī)制形式參數(shù)在函數(shù)調(diào)用時(shí)才分配存儲空間,并接受實(shí)際參數(shù)的值實(shí)際參數(shù)可以是復(fù)雜的表達(dá)式,在函數(shù)調(diào)用前計(jì)算表達(dá)式的值形式參數(shù)與實(shí)際參數(shù)可同名,也可不同名西安電子科技大學(xué)計(jì)算機(jī)學(xué)院27參數(shù)傳遞機(jī)制實(shí)際參數(shù)值逐一賦值給形式參數(shù),它們必須保持?jǐn)?shù)目、類型、順序的一致參數(shù)的賦值過程單向不可逆,函數(shù)內(nèi)部對形式參數(shù)值的修改不會反映到實(shí)際參數(shù)中函數(shù)參數(shù)一般為函數(shù)輸入集的一部分,函數(shù)輸出結(jié)果一般使用返回值表示,只有使用特殊的手段(指針/數(shù)組)才可以將函數(shù)參數(shù)作為函數(shù)輸出集的一部分西安電子科技大學(xué)計(jì)算機(jī)學(xué)院28參數(shù)傳遞機(jī)制voidswap(inta,intb){intt;t=a;a=b;b=t;}intmain(){inta=5,b=3;
printf("beforeswap:a=%d;b=%d\n",a,b);swap(a,b);printf("afterswap:a=%d;b=%d\n",a,b);return0;}swap函數(shù)中的a和b與main函數(shù)中的a和b是什么關(guān)系?兩個(gè)printf輸出的結(jié)果是什么?swap函數(shù)數(shù)據(jù)區(qū)main函數(shù)數(shù)據(jù)區(qū)voidswap(inta,intb){intt;
//2t=a;a=b;b=t;
//3}intmain(){inta=5,b=3;
//1
swap(a,b);
//4return0;}5a0x0012ff24內(nèi)存地址值變量3b0x0012ff283a0x0012ff245b0x0012ff285a0x0012ff7c3b0x0012ff78內(nèi)存地址值變量5a0x0012ff7c3b0x0012ff78西安電子科技大學(xué)計(jì)算機(jī)學(xué)院30函數(shù)示例1.請寫一個(gè)程序,給出指定整數(shù)范圍[1,10000]內(nèi)的所有完數(shù)。判斷某個(gè)整數(shù)是不是完數(shù)用一個(gè)函數(shù)完成。函數(shù)的返回值是什么類型?對于判斷型的函數(shù),通常用int表示返回值,非0表示“是”,0表示“否”函數(shù)參數(shù)是什么(數(shù)量,類型)?一個(gè)整數(shù)函數(shù)名?有意義的名字31//主函數(shù)intmain(){intn;for(n=1;n<=10000;n++){
if(isPerfectNumber(n)){printf(“%d\n”,n);}}return0;}//功能:判斷n是不是完數(shù)//返回值:0-表示不是完數(shù)// 非0-表示是完數(shù)//參數(shù):n--待判斷的整數(shù)intisPerfectNumber(intn){inti,sum=0;for(i=1;i<=n/2;i++){if(n%i==0)sum+=i;}returnsum==n;}//函數(shù)聲明intisPerfectNumber(intn);西安電子科技大學(xué)計(jì)算機(jī)學(xué)院32函數(shù)示例2.寫一個(gè)函數(shù)求兩個(gè)整數(shù)的最大公約數(shù)函數(shù)的返回值是什么類型?最大公約數(shù)是整數(shù),因此用int表示返回值函數(shù)參數(shù)是什么(數(shù)量,類型)?兩個(gè)整數(shù)函數(shù)名?有意義的名字西安電子科技大學(xué)計(jì)算機(jī)學(xué)院33//主函數(shù)intmain(){inta,b;scanf(“%d%d”,&a,&b);printf(“%d\n”,gcd(a,b));return0;}//函數(shù)聲明intgcd(intm,intn);//功能:求m和n的最大公約數(shù)//返回值:求得的最大公約數(shù)//參數(shù):m,n--兩個(gè)整數(shù)intgcd(intm,intn){inti;intmin=m<n?m:n;for(i=min;i>1;i--){if(m%i==0&&n%i==0) break;
}
returni;}函數(shù)示例3.寫一個(gè)函數(shù)判斷一個(gè)數(shù)是不是素?cái)?shù)函數(shù)的返回值是什么類型?對于判斷型的函數(shù),通常用int表示返回值,非0表示“是”,0表示“否”函數(shù)參數(shù)是什么(數(shù)量,類型)?一個(gè)整數(shù)函數(shù)名?有意義的名字西安電子科技大學(xué)計(jì)算機(jī)學(xué)院3435//主函數(shù)intmain(){intn;for(n=1;n<=100;n++){
if(isPrime(n)){printf(“%d\n”,n);}}return0;}//功能:判斷n是不是素?cái)?shù)//返回值:0-表示不是素?cái)?shù)// 非0-表示是素?cái)?shù)//參數(shù):n--待判斷的整數(shù)intisPrime(intn){inti,isprime=1;for(i=2;i<n;i++){if(n%i==0){isprime=0;break;}}returnisprime;}//函數(shù)聲明intisPrime(intn);西安電子科技大學(xué)計(jì)算機(jī)學(xué)院36課堂練習(xí)如果一個(gè)3位整數(shù)各位數(shù)字的立方和等于這個(gè)數(shù)就是水仙花數(shù)。寫一個(gè)函數(shù)判斷傳入的整數(shù)n(100<n<1000)是不是“水仙花數(shù)”。函數(shù)的返回值是什么類型?函數(shù)參數(shù)是什么(數(shù)量,類型)?函數(shù)名?西安電子科技大學(xué)計(jì)算機(jī)學(xué)院374.3C語言常用函數(shù)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院38數(shù)學(xué)函數(shù)#include<math.h>doublesin(double);//正弦,參數(shù)為弧度doublesqrt(double);doublepow(double,double);doublefabs(double);doubleceil(double);//向上取整doublefloor(double);//向下取整西安電子科技大學(xué)計(jì)算機(jī)學(xué)院39輸入輸出函數(shù)#include<stdio.h>printf—格式化輸出scanf—格式化輸入getchar—輸入一個(gè)字符putchar—輸出一個(gè)字符西安電子科技大學(xué)計(jì)算機(jī)學(xué)院40輸入輸出函數(shù)intscanf(constchar*format[,argument]...);可變參數(shù)-參數(shù)個(gè)數(shù)>=1返回值表示正確轉(zhuǎn)換并賦值的字段數(shù),經(jīng)常用來判斷輸入格式是否正確西安電子科技大學(xué)計(jì)算機(jī)學(xué)院41scanf返回值示例(scanf.c)#include<stdio.h>intmain(){intn=0;inta=0,b=0;n=scanf("%d%d",&a,&b);printf("n=%d\n",n,);printf("a=%db=%d\n",a,b);return0;}輸入1:34輸入2:34.5輸入3:3a輸出1:n=2a=3b=4輸出2:n=2a=3b=4輸出1:n=1a=3b=0西安電子科技大學(xué)計(jì)算機(jī)學(xué)院42輸入輸出函數(shù)intgetchar()—從標(biāo)準(zhǔn)輸入流(stdin)讀取一個(gè)字符緩沖輸入,需要按下回車后才能獲取到值正常情況下,返回值表示讀入的字符如果返回值是EOF(-1)表示讀錯(cuò)誤或到了流結(jié)束位置intputchar(intch)—將字符ch寫入標(biāo)準(zhǔn)輸出流(stdout)示例1將輸入的一行小寫字母轉(zhuǎn)換成大寫字母。對于用戶輸入的每個(gè)字符,如果是小寫字母則轉(zhuǎn)換為大寫字母,否則結(jié)束處理循環(huán)多少次?循環(huán)結(jié)束條件?小寫字母如何轉(zhuǎn)化為大寫字母?西安電子科技大學(xué)計(jì)算機(jī)學(xué)院43西安電子科技大學(xué)計(jì)算機(jī)學(xué)院44時(shí)間函數(shù)#include<time.h>time_ttime(time_t*timer)—獲得從1970/1/1至今的秒數(shù)time_t可以看作整數(shù)類型clock_tclock();—獲得從程序開始運(yùn)行至調(diào)用該函數(shù)時(shí)處理器經(jīng)過的時(shí)鐘數(shù)clock_t可以看作整數(shù)類型CLOCKS_PER_SEC—表示每秒有多少個(gè)時(shí)鐘的常數(shù)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院45時(shí)間函數(shù)(time.c)#include<stdio.h>#include<time.h>intmain(){intstart,finish;doubletime;
start=clock();...…finish=clock();time=(finish-start)*1.0/CLOCKS_PER_SEC;….return0;}對這一段程序計(jì)時(shí)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院46隨機(jī)數(shù)函數(shù)#include<stdlib.h>intrand()—產(chǎn)生一個(gè)[0,RAND_MAX]范圍內(nèi)的偽隨機(jī)數(shù)RAND_MAX是一個(gè)系統(tǒng)常數(shù),可以直接使用voidsrand(unsignedintseed)—設(shè)置偽隨機(jī)數(shù)序列的種子如果不設(shè)定隨機(jī)數(shù)系列的種子,同一個(gè)程序兩次運(yùn)行得到的隨機(jī)數(shù)完全相同通常以時(shí)間作為隨機(jī)數(shù)種子西安電子科技大學(xué)計(jì)算機(jī)學(xué)院47隨機(jī)數(shù)函數(shù)產(chǎn)生5個(gè)隨機(jī)數(shù)(rand1.c)#include<stdio.h>#include<stdlib.h>intmain(){inti;printf("RAND_MAXis%d.\n",RAND_MAX);printf("Fivenumbersgeneratedasfollows:\n");for(i=0;i<5;i++)printf(“%d",rand());printf("\n");return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院48隨機(jī)函數(shù)用時(shí)間做種子產(chǎn)生5個(gè)隨機(jī)數(shù)(rand2.c)#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){inti;printf("Fivenumbersgeneratedasfollows:\n");
srand((int)time(NULL));for(i=0;i<5;i++) printf("%d;",rand());printf("\n");return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院49隨機(jī)函數(shù)生成5個(gè)[low,high]范圍內(nèi)的隨機(jī)數(shù)(rand3.c)#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){inti,low=10,high=20;srand((int)time(NULL));for(i=0;i<5;i++) printf("%d;",low+(rand()%(high-low)));printf("\n");return0;}猜數(shù)字游戲隨機(jī)產(chǎn)生一個(gè)0-100之間的數(shù)字n,用戶每次輸入一個(gè)整數(shù)m,如果m>n,提示太大了,如果m<n提示太小了,直到用戶輸入的m=n。西安電子科技大學(xué)計(jì)算機(jī)學(xué)院50西安電子科技大學(xué)計(jì)算機(jī)學(xué)院514.4函數(shù)與遞歸西安電子科技大學(xué)計(jì)算機(jī)學(xué)院52引言函數(shù)調(diào)用可以嵌套,即在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)如果一個(gè)函數(shù)調(diào)用自己就會構(gòu)成遞歸調(diào)用doublec_area(doubler){returnpow(r,2)*3.1416;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院53遞歸函數(shù)示例求n!Fibonacci數(shù)列intfact(intn){if(n==0)return1;returnn*fact(n-1);}intfib(intn){if(n==0||n==1)return1;returnfib(n-1)+fib(n-2);}intmain(){printf("3!=%d",fact(3));}intmain(){printf("F(5)=%d",fib(5));}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院54遞歸函數(shù)的調(diào)用過程intfact(intn){if(n==0)return1;returnn*fact(n-1);}intmain(){printf("3!=%d",fact(3));}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院55西安電子科技大學(xué)計(jì)算機(jī)學(xué)院56使用遞歸的條件具有遞歸定義的形式對問題的求解可以通過規(guī)模更小的相同問題求解來完成有明確的結(jié)束條件結(jié)束條件遞歸定義西安電子科技大學(xué)計(jì)算機(jī)學(xué)院57漢諾塔(hanoi)問題假設(shè)有三個(gè)分別命名為X、Y和Z的塔座,在塔座X上插有n個(gè)直徑大小不同、依小到大分別編號為1,2,...,n的圓盤,如圖所示:要求將塔座X上的n個(gè)圓盤移動到塔座Z上并按相同順序疊放,圓盤移動時(shí)必須遵循下述規(guī)則:每次只能移動一個(gè)圓盤;圓盤可以插在X、Y與Z中的任意塔座上;任何時(shí)刻都不能將較大的圓盤壓在較小的圓盤上。如何實(shí)現(xiàn)移動圓盤的操作呢?西安電子科技大學(xué)計(jì)算機(jī)學(xué)院58漢諾塔(hanoi)問題西安電子科技大學(xué)計(jì)算機(jī)學(xué)院59漢諾塔(hanoi)問題待解決的問題Q1:是否存在某種簡單情形,問題很容易解決Q2:是否可將原始問題分解成性質(zhì)相同但規(guī)模較小的子問題,且新問題的解答對原始問題有關(guān)鍵意義西安電子科技大學(xué)計(jì)算機(jī)學(xué)院60漢諾塔(hanoi)問題解決方案A1:只有一個(gè)圓盤時(shí)是最簡單情形A2:對于n>1,考慮n–1個(gè)圓盤,如果能將n-1個(gè)圓盤移動到某個(gè)塔座上,則可以移動第n個(gè)圓盤策略:首先將n–1個(gè)圓盤移動到塔座Y上,然后將第n個(gè)圓盤移動到Z上,最后再將n-1個(gè)圓盤從Y上移動到Z上西安電子科技大學(xué)計(jì)算機(jī)學(xué)院61漢諾塔(hanoi)問題voidMoveHanoi(unsignedintn, //圓盤數(shù)量charfrom, //起始位置chartmp, //中轉(zhuǎn)位置charto){ //目標(biāo)位置if(n==1)//遞歸結(jié)束條件
將圓盤1從from移動到toelse{
將n–1個(gè)圓盤從from以to為中轉(zhuǎn)移動到tmp;
//遞歸
將圓盤n從from移動到to
將n-1個(gè)圓盤從tmp以from為中轉(zhuǎn)移動到to;//遞歸}}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院62遞歸的缺點(diǎn)函數(shù)調(diào)用需要額外的空間(棧)來完成,在調(diào)用次數(shù)很多的情況下會降低程序效率遞歸調(diào)用中的重復(fù)計(jì)算西安電子科技大學(xué)計(jì)算機(jī)學(xué)院63Fibonacci數(shù)列的兩種求解方法(fib.c)//使用遞歸求Fibonacci數(shù)列intfib_recursion(intn){if(n==0||n==1)return1;returnfib_recursion(n-1)+fib_recursion(n-2);}//使用循環(huán)求Fibonacci數(shù)列intfib_loop(intn){intfn,fn_1=1,fn_2=1,i;if(n==0||n==1) return1;for(i=2;i<=n;i++){fn=fn_1+fn_2; //計(jì)算f(n)fn_2=fn_1; //更新f(n-2)fn_1=fn;//更新f(n-1)}returnfn;}遞歸到循環(huán)的轉(zhuǎn)換常常需要借助于高級的程序設(shè)計(jì)技術(shù)和一定的數(shù)據(jù)結(jié)構(gòu)才能完成64兔子繁殖問題(Fibonacci數(shù)列)假設(shè)有一對兔子,一個(gè)月后成長為大兔子,從第二個(gè)月開始,每對大兔子生一對小兔子。不考慮兔子的死亡,求第n個(gè)月的兔子總數(shù)月份小兔子大兔子總數(shù)010110112112312342355358西安電子科技大學(xué)計(jì)算機(jī)學(xué)院65兔子繁殖問題(Fibonacci數(shù)列)遞推過程F(n-1)=M2+(M2+M1)F(n)=(M2+M1)+(M2+M1+M2)F(n)=F(n-2)+F(n-1)F(0)=1F(1)=1//初始條件F(n-2)=M1+M2//設(shè)第n-2個(gè)月有M1對小兔子,//M2對大兔子西安電子科技大學(xué)計(jì)算機(jī)學(xué)院66走樓梯(Fibonacci數(shù)列)樓梯有n階臺階,上樓可以一步上1階,也可以一步上2階,編一程序計(jì)算共有多少種不同的走法.西安電子科技大學(xué)計(jì)算機(jī)學(xué)院67用遞歸方法解決求一個(gè)整數(shù)各位數(shù)字之和假設(shè)整數(shù)為n,各位數(shù)字之和為sum遞歸結(jié)束條件:n<10,sum=n遞歸定義:n>10,sum=個(gè)位數(shù)+去掉個(gè)位數(shù)之后各位數(shù)字之和n的個(gè)位數(shù)?n去掉個(gè)位數(shù)?#include<stdio.h>intsum(intn){ if(n<10) returnn; else returnn%10+sum(n/10);}intmain(){ intn; scanf("%d",&n); printf("sum=%d\n",sum(n)); return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院694.5變量作用域西安電子科技大學(xué)計(jì)算機(jī)學(xué)院70swap函數(shù)的問題參數(shù)傳遞是賦值傳遞,修改函數(shù)參數(shù)(形參)對
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教師培訓(xùn)課件:高中新課程與音樂課程標(biāo)準(zhǔn)
- 盆腔淤血綜合征的健康宣教
- 八年級英語FriendsGrammar課件
- 特發(fā)性腹膜后纖維化的健康宣教
- 瘰疬分枝桿菌感染的臨床護(hù)理
- 慢性纖維性甲狀腺炎的臨床護(hù)理
- 中華優(yōu)xiu傳統(tǒng)文化(山東經(jīng)貿(mào)職業(yè)學(xué)院)知到智慧樹答案
- 《數(shù)據(jù)處理及誤差》課件
- 運(yùn)營管理團(tuán)隊(duì)協(xié)作培訓(xùn)
- 緊急救援計(jì)劃
- 重慶財(cái)經(jīng)學(xué)院《自然語言處理》2022-2023學(xué)年第一學(xué)期期末試卷
- 【MOOC】大學(xué)生職業(yè)發(fā)展與就業(yè)指導(dǎo)-河南科技大學(xué) 中國大學(xué)慕課MOOC答案
- 2024年度總結(jié)暨表彰大會議程例文(3篇)
- GB/T 44898-2024基本公共服務(wù)均等化評價(jià)通則
- 糖尿病傷口護(hù)理
- 第07課 開關(guān)量的與運(yùn)算(說課稿)2024-2025學(xué)年六年級上冊信息技術(shù)人教版
- 中華人民共和國突發(fā)事件應(yīng)對法培訓(xùn)課件
- 設(shè)備維護(hù)保養(yǎng)培訓(xùn)
- 住院病人身體約束護(hù)理
- vivo2023可持續(xù)發(fā)展報(bào)告-企業(yè)行動ESG
- 風(fēng)機(jī)安裝施工合同模板
評論
0/150
提交評論