《C語言程序設(shè)計(jì)d》課件-第四講-函數(shù)_第1頁
《C語言程序設(shè)計(jì)d》課件-第四講-函數(shù)_第2頁
《C語言程序設(shè)計(jì)d》課件-第四講-函數(shù)_第3頁
《C語言程序設(shè)計(jì)d》課件-第四講-函數(shù)_第4頁
《C語言程序設(shè)計(jì)d》課件-第四講-函數(shù)_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論