版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語(yǔ)言程序設(shè)計(jì)Lec4函數(shù)2021/5/91引言例:求一些圓盤的面積,圓盤半徑分別為:3.24、2.13、0.865、3.746、12.3364、8.421//設(shè)圓周率為3.1416,可寫出下面程序:#include<stdio.h>intmain(){printf("radius:%f,area:%f\n",3.24,3.24*3.24*3.1416);printf("radius:%f,area:%f\n",2.13,2.13*2.12*3.1415);…}繁瑣的東西很容易弄錯(cuò),不易修改標(biāo)準(zhǔn)函數(shù)有限,需求無(wú)限。2021/5/92西安電子科技大學(xué)計(jì)算機(jī)學(xué)院引言如果有求圓面積的函數(shù)doublec_area(doubler)如果有打印圓面積的函數(shù)pc_area(doubler)intmain(){printf("radius:%f,area:%f\n",3.24,c_area(3.24));printf("radius:%f,area:%f\n",2.13,c_area(2.13));…}函數(shù)能使程序變短,變得易寫/易理解/易修改intmain(){
pc_area(3.24);
pc_area(2.13);…}2021/5/93西安電子科技大學(xué)計(jì)算機(jī)學(xué)院引言半徑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.22021/5/94西安電子科技大學(xué)計(jì)算機(jī)學(xué)院目標(biāo)學(xué)會(huì)把常用的代碼定義為函數(shù)學(xué)會(huì)在程序中使用函數(shù)掌握C語(yǔ)言提供的常用庫(kù)函數(shù)了解遞歸的基本原理2021/5/95西安電子科技大學(xué)計(jì)算機(jī)學(xué)院主要內(nèi)容函數(shù)定義函數(shù)調(diào)用C語(yǔ)言常用函數(shù)函數(shù)與遞歸變量作用域2021/5/96西安電子科技大學(xué)計(jì)算機(jī)學(xué)院4.1函數(shù)定義將實(shí)現(xiàn)某個(gè)功能的代碼變成函數(shù)2021/5/97西安電子科技大學(xué)計(jì)算機(jī)學(xué)院函數(shù)定義把一段計(jì)算定義成函數(shù)并給以命名,定義后就可以在任何需要的地方通過(guò)名字調(diào)用。//定義函數(shù)c_area的程序片段:doublec_area(doubler){returnr*r*3.1416;}2021/5/98西安電子科技大學(xué)計(jì)算機(jī)學(xué)院定義函數(shù)的要素函數(shù)頭函數(shù)名:使用函數(shù)需要的名稱,合法標(biāo)識(shí)符返回值類型—函數(shù)計(jì)算結(jié)果的數(shù)據(jù)類型參數(shù)表—完成計(jì)算需要的數(shù)據(jù)(數(shù)量和類型)函數(shù)體doublec_area(doubler)
{returnr*r*3.1416;}返回值類型函數(shù)名參數(shù)表函數(shù)體函數(shù)頭實(shí)現(xiàn)函數(shù)功能的代碼,由一對(duì)大括號(hào)包圍2021/5/99函數(shù)返回值函數(shù)返回值表示函數(shù)內(nèi)代碼計(jì)算的結(jié)果一個(gè)函數(shù)最多只能有一個(gè)返回值,返回值通常是計(jì)算結(jié)果或者表示計(jì)算狀態(tài)的信息,由調(diào)用者使用如果函數(shù)有返回值函數(shù)必須指定返回值類型,如果函數(shù)不需要返回值必須使用void作為函數(shù)返回值類型。函數(shù)返回值通過(guò)return語(yǔ)句返回,return語(yǔ)句一旦執(zhí)行,整個(gè)函數(shù)就結(jié)束。2021/5/910西安電子科技大學(xué)計(jì)算機(jī)學(xué)院函數(shù)返回值一個(gè)函數(shù)中可以有多條return語(yǔ)句,但只會(huì)執(zhí)行其中一條。return語(yǔ)句形式:return表達(dá)式;return語(yǔ)句中表達(dá)式求值的類型應(yīng)該和函數(shù)返回值類型一致,如果不一致會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換返回值類型為void時(shí),不需要return語(yǔ)句或者寫成return;2021/5/911西安電子科技大學(xué)計(jì)算機(jī)學(xué)院函數(shù)定義示例voidpc_area(doubler){
printf("r=%f,S=%f\n",r,3.14159265*r*r);}doublec_area(doubler){returnr*r*3.1416;}intmax(inta,intb){
if(a>b)returna;returnb;}intcompare(intx,inty){if(x==y)return0;elseif(x>y)return1;elsereturn-1;}2021/5/912關(guān)于return語(yǔ)句doublec_area(doubler){returnr*r*3.1416;}intmain(){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)算2021/5/913函數(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)用者傳入(通過(guò)實(shí)際參數(shù)以值拷貝的方式傳入)2021/5/914西安電子科技大學(xué)計(jì)算機(jī)學(xué)院形參和實(shí)參形參:在函數(shù)定義中括號(hào)內(nèi)的標(biāo)識(shí)符,與函數(shù)調(diào)用時(shí)的實(shí)參一一對(duì)應(yīng)實(shí)參:在調(diào)用函數(shù)的括號(hào)中使用的表達(dá)式,它的值被傳入函數(shù)并賦值給函數(shù)的對(duì)應(yīng)形參。2021/5/915西安電子科技大學(xué)計(jì)算機(jī)學(xué)院形參和實(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)傳遞給形參r2021/5/916西安電子科技大學(xué)計(jì)算機(jī)學(xué)院函數(shù)定義不能嵌套#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;}#include<stdio.h>#include<math.h>intmain(){doublec_area(doubler){returnpow(r,2)*3.1416;}doublev;v=2.4*c_area(3.24)/3.0;
return0;}2021/5/917西安電子科技大學(xué)計(jì)算機(jī)學(xué)院4.2函數(shù)調(diào)用2021/5/918西安電子科技大學(xué)計(jì)算機(jī)學(xué)院調(diào)用系統(tǒng)函數(shù)包含必要的頭文件,其本質(zhì)是將函數(shù)原型添加到程序中在需要的地方使用函數(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;}函數(shù)原型就是函數(shù)頭部加上分號(hào),其作用是告訴編譯器函數(shù)應(yīng)該以什么形式調(diào)用2021/5/919西安電子科技大學(xué)計(jì)算機(jī)學(xué)院調(diào)用自定義函數(shù)方法1(函數(shù)定義放在調(diào)用函數(shù)之前):在需要的地方使用函數(shù),傳入類型和數(shù)量正確的實(shí)際參數(shù),函數(shù)返回值可以作為表達(dá)式的一部分#include<stdio.h>//c_area函數(shù)在調(diào)用前定義doublec_area(doubler){returnr*r*3.1416;}intmain(){doublev;printf("radius:%f,area:%f\n", 3.24,
c_area(3.24));v=2.4*c_area(3.24)/3.0;
return0;}2021/5/920西安電子科技大學(xué)計(jì)算機(jī)學(xué)院調(diào)用自定義函數(shù)方法2(函數(shù)定義放在調(diào)用函數(shù)之后):在函數(shù)調(diào)用之前給出函數(shù)原型在需要的地方使用函數(shù),傳入類型和數(shù)量正確的實(shí)際參數(shù),函數(shù)返回值可以作為表達(dá)式的一部分#include<stdio.h>//函數(shù)原型在調(diào)用之前doublec_area(doubler);intmain(){doublev;printf("radius:%f,area:%f\n", 3.24,
c_area(3.24));v=2.4*c_area(3.24)/3.0;return0;}//函數(shù)定義在調(diào)用之后doublec_area(doubler){returnr*r*3.1416;}2021/5/921西安電子科技大學(xué)計(jì)算機(jī)學(xué)院函數(shù)調(diào)用的若干問(wèn)題C語(yǔ)言是一個(gè)函數(shù)式語(yǔ)言,所有可執(zhí)行語(yǔ)句都必須放在某個(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ù)2021/5/922西安電子科技大學(xué)計(jì)算機(jī)學(xué)院函數(shù)調(diào)用的若干問(wèn)題#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)2021/5/923西安電子科技大學(xué)計(jì)算機(jī)學(xué)院參數(shù)傳遞機(jī)制形式參數(shù)在函數(shù)調(diào)用時(shí)才分配存儲(chǔ)空間,并接受實(shí)際參數(shù)的值實(shí)際參數(shù)可以為復(fù)雜的表達(dá)式,在函數(shù)調(diào)用前獲得計(jì)算形式參數(shù)與實(shí)際參數(shù)可同名,也可不同名2021/5/924西安電子科技大學(xué)計(jì)算機(jī)學(xué)院參數(shù)傳遞機(jī)制參數(shù)較多時(shí),實(shí)際參數(shù)值逐一賦值,它們必須保持?jǐn)?shù)目、類型、順序的一致參數(shù)的賦值過(guò)程單向不可逆,函數(shù)內(nèi)部對(duì)形式參數(shù)值的修改不會(huì)反映到實(shí)際參數(shù)中函數(shù)參數(shù)一般為函數(shù)輸入集的一部分,函數(shù)輸出集一般使用返回值表示,只有使用特殊的手段(指針/數(shù)組)才可以將函數(shù)參數(shù)作為函數(shù)輸出集的一部分2021/5/925西安電子科技大學(xué)計(jì)算機(jī)學(xué)院參數(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)系??jī)蓚€(gè)printf輸出的結(jié)果是什么?2021/5/926西安電子科技大學(xué)計(jì)算機(jī)學(xué)院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)存地址值變量5a0x0012ff7c3b0x0012ff782021/5/927函數(shù)示例1.請(qǐng)寫一個(gè)程序,給出指定整數(shù)范圍[1,10000]內(nèi)的所有完數(shù)。判斷是不是完數(shù)用一個(gè)函數(shù)完成。intisPerfectNumber(intn){inti;for(i=1,sum=0;i<=n/2;i++){if(n%i==0)sum+=i;}returnsum==n;}2021/5/928西安電子科技大學(xué)計(jì)算機(jī)學(xué)院函數(shù)示例2.寫一個(gè)函數(shù)求兩個(gè)整數(shù)的最大公約數(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;}2021/5/929西安電子科技大學(xué)計(jì)算機(jī)學(xué)院函數(shù)示例3.寫一個(gè)函數(shù)判斷一個(gè)數(shù)是不是素?cái)?shù),用函數(shù)返回值表示判斷結(jié)果(非0表示是素?cái)?shù),0表示不是素?cái)?shù))intisPrime(intn){inti,isprime=1;for(i=2;i<n;i++){if(n%i==0){isprime=0;break;}}returni==n;}2021/5/930西安電子科技大學(xué)計(jì)算機(jī)學(xué)院課堂練習(xí)寫一個(gè)函數(shù)判斷傳入的整數(shù)n(100<n<1000)是不是“水仙花數(shù)”,是返回1,否則返回0如果一個(gè)3位整數(shù)各位數(shù)字的立方和等于這個(gè)數(shù)就是水仙花數(shù)2021/5/931西安電子科技大學(xué)計(jì)算機(jī)學(xué)院4.3變量作用域(教材5.4)2021/5/932西安電子科技大學(xué)計(jì)算機(jī)學(xué)院swap函數(shù)的問(wèn)題參數(shù)傳遞是賦值傳遞,修改函數(shù)參數(shù)(形參)對(duì)原來(lái)的數(shù)據(jù)(實(shí)參)沒(méi)有影響,因此不能完成交換數(shù)據(jù)的任務(wù)解決方法方法1:修改需要交換的數(shù)據(jù)的作用域,將其變?yōu)槿肿兞糠椒?:通過(guò)參數(shù)傳遞需要交換的數(shù)據(jù)的地址2021/5/933西安電子科技大學(xué)計(jì)算機(jī)學(xué)院變量作用域作用域:變量的有效范圍,也就是變量的生存范圍局部變量:函數(shù)參數(shù),其作用域?yàn)檎麄€(gè)函數(shù)函數(shù)內(nèi)的變量,其作用域?yàn)樽兞慷x位置到函數(shù)結(jié)束位置復(fù)合語(yǔ)句內(nèi)的變量,其作用域?yàn)樽兞慷x位置到復(fù)合語(yǔ)句結(jié)束位置全局變量定義在所有函數(shù)之外的變量,其作用域?yàn)樽兞慷x位置到程序結(jié)束位置2021/5/934西安電子科技大學(xué)計(jì)算機(jī)學(xué)院#include<stdio.h>inta=10,b=10;//全局變量voidfunc1(){printf("func1:a=%d,b=%d\n",a,b);}voidfunc2(){inta=30,b=30;printf("func2:a=%d,b=%d\n",a,b);}intc=1,d=1;voidfunc3(inta,intb){printf("fuc3:a=%d,b=%d\n",a,b);}intmain(){inta=20,b=20;…{inta=40,b=40;…}…}全局變量a,b的作用域全局變量c,d的作用域局部變量a,b的作用域函數(shù)參數(shù)a,b的作用域main函數(shù)局部變量a,b的作用域復(fù)合結(jié)構(gòu)內(nèi)a,b的作用域2021/5/935使用全局變量的swap函數(shù)voidswap(){intt;
t=a;a=b;b=t;}intmain(){printf("beforeswap:a=%d;b=%d\n",a,b);swap();printf("afterswap:a=%d;b=%d\n",a,b);return0;}inta=5,b=3;2021/5/936西安電子科技大學(xué)計(jì)算機(jī)學(xué)院4.4C語(yǔ)言常用函數(shù)2021/5/937西安電子科技大學(xué)計(jì)算機(jī)學(xué)院數(shù)學(xué)函數(shù)#include<math.h>doublesin(doublerad);doublesqrt(intn);doublepow(double,double);doublefabs(double);doublelog(doublex);doublelog10(doublex);2021/5/938西安電子科技大學(xué)計(jì)算機(jī)學(xué)院輸入輸出函數(shù)#include<stdio.h>printf—格式化輸出scanf—格式化輸入getchar—輸入一個(gè)字符putchar—輸出一個(gè)字符2021/5/939西安電子科技大學(xué)計(jì)算機(jī)學(xué)院輸入輸出函數(shù)intscanf(constchar*format[,argument]...);可變參數(shù)-參數(shù)個(gè)數(shù)>=1返回值表示正確轉(zhuǎn)換并賦值的字段數(shù),經(jīng)常用來(lái)判斷輸入格式是否正確2021/5/940西安電子科技大學(xué)計(jì)算機(jī)學(xué)院scanf返回值示例(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=02021/5/941西安電子科技大學(xué)計(jì)算機(jī)學(xué)院輸入輸出函數(shù)intgetchar()—從標(biāo)準(zhǔn)輸入流(stdin)讀取一個(gè)字符緩沖輸入,需要按下回車后才能獲取到值正常情況下,返回值表示讀入的字符如果返回值是EOF(-1)表示讀錯(cuò)誤或到了流結(jié)束位置intputchar(intch)—將字符ch寫入標(biāo)準(zhǔn)輸出流(stdout)示例:將輸入的一行小寫字符轉(zhuǎn)換成大寫字符。(chario.c)2021/5/942西安電子科技大學(xué)計(jì)算機(jī)學(xué)院時(shí)間函數(shù)#include<time.h>time_ttime(time_t*timer)—獲得從1970/1/1至今的秒數(shù)time_t可以看作整數(shù)類型clock_tclock();—獲得從程序開始運(yùn)行至今處理器經(jīng)過(guò)的時(shí)鐘數(shù)clock_t可以看作整數(shù)類型CLOCKS_PER_SEC—表示每秒有多少個(gè)時(shí)鐘的常數(shù)2021/5/943西安電子科技大學(xué)計(jì)算機(jī)學(xué)院時(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;}對(duì)這一段程序計(jì)時(shí)2021/5/944西安電子科技大學(xué)計(jì)算機(jī)學(xué)院隨機(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ù)種子2021/5/945西安電子科技大學(xué)計(jì)算機(jī)學(xué)院隨機(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;}2021/5/946西安電子科技大學(xué)計(jì)算機(jī)學(xué)院隨機(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;}2021/5/947西安電子科技大學(xué)計(jì)算機(jī)學(xué)院隨機(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;}2021/5/948西安電子科技大學(xué)計(jì)算機(jī)學(xué)院4.5函數(shù)與遞歸(教材4.3)2021/5/949西安電子科技大學(xué)計(jì)算機(jī)學(xué)院引言函數(shù)調(diào)用可以嵌套,即在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)如果一個(gè)函數(shù)調(diào)用自己就會(huì)構(gòu)成遞歸調(diào)用doublec_area(doubler){returnpow(r,2)*3.1416;}2021/5/950西安電子科技大學(xué)計(jì)算機(jī)學(xué)院遞歸函數(shù)示例求n!Fibonacci數(shù)列intfac(intn){if(n==0)return1;returnn*fac(n-1);}intfib(intn){if(n==0||n==1)return1;returnfib(n-1)+fib(n-2);}intmain(){printf("3!=%d",fac(3));}intmain(){printf("F(5)=%d",fib(5));}2021/5/951西安電子科技大學(xué)計(jì)算機(jī)學(xué)院遞歸函數(shù)的調(diào)用過(guò)程2021/5/952西安電子科技大學(xué)計(jì)算機(jī)學(xué)院使用遞歸的條件具有遞歸定義的形式有明確的結(jié)束條件結(jié)束條件遞歸定義2021/5/953西安電子科技大學(xué)計(jì)算機(jī)學(xué)院漢諾塔(hanoi)問(wèn)題假設(shè)有三個(gè)分別命名為X、Y和Z的塔座,在塔座X上插有n個(gè)直徑大小不同、依小到大分別編號(hào)為1,2,...,n的圓盤,如圖所示:要求將塔座X上的n個(gè)圓盤移動(dòng)到塔座Z上并按相同順序疊放,圓盤移動(dòng)時(shí)必須遵循下述規(guī)則:每次只能移動(dòng)一個(gè)圓盤;圓盤可以插在X、Y與Z中的任意塔座上;任何時(shí)刻都不能將較大的圓盤壓在較小的圓盤上。如何實(shí)現(xiàn)移動(dòng)圓盤的操作呢?2021/5/954西安電子科技大學(xué)計(jì)算機(jī)學(xué)院漢諾塔(hanoi)問(wèn)題2021/5/955西安電子科技大學(xué)計(jì)算機(jī)學(xué)院漢諾塔(hanoi)問(wèn)題待解決的問(wèn)題Q1:是否存在某種簡(jiǎn)單情形,問(wèn)題很容易解決Q2:是否可將原始問(wèn)題分解成性質(zhì)相同但規(guī)模較小的子問(wèn)題,且新問(wèn)題的解答對(duì)原始問(wèn)題有關(guān)鍵意義2021/5/956西安電子科技大學(xué)計(jì)算機(jī)學(xué)院漢諾塔(hanoi)問(wèn)題解決方案A1:只有一個(gè)圓盤時(shí)是最簡(jiǎn)單情形A2:對(duì)于n>1,考慮n–1個(gè)圓盤,如果能將n-1個(gè)圓盤移動(dòng)到某個(gè)塔座上,則可以移動(dòng)第n個(gè)圓盤策略:首先將n–1個(gè)圓盤移動(dòng)到塔座Y上,然后將第n個(gè)圓盤移動(dòng)到Z上,最后再將n-1個(gè)圓盤從Y上移動(dòng)到Z上2021/5/957西安電子科技大學(xué)計(jì)算機(jī)學(xué)院漢諾塔(hanoi)問(wèn)題voidMoveHanoi(unsignedintn, //圓盤數(shù)量charfrom, //起始位置chartmp, //中轉(zhuǎn)位置charto){ //目標(biāo)位置if(n==1)//遞歸結(jié)束條件
將圓盤1從from移動(dòng)到toelse{
將n–1個(gè)圓盤從from以to為中轉(zhuǎn)移動(dòng)到tmp;
//遞歸
將圓盤n從from移動(dòng)到to
將n-1個(gè)圓盤從tmp以from為中轉(zhuǎn)移動(dòng)到to;//遞歸}}2021/5/958西安電子科技大學(xué)計(jì)算機(jī)學(xué)院遞歸的缺點(diǎn)函數(shù)調(diào)用需要額外的空間(棧)來(lái)完成,在調(diào)用次數(shù)很多的情況下會(huì)降低程序效率遞歸調(diào)用中的重復(fù)計(jì)算2021/5/959西安電子科技大學(xué)計(jì)算機(jī)學(xué)院Fibonacci數(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)換常常需要借助于高級(jí)的程序設(shè)計(jì)技術(shù)和一定的數(shù)據(jù)結(jié)構(gòu)才能完成2021/5/960西安電子科技大學(xué)計(jì)算機(jī)學(xué)院兔子繁殖問(wèn)題(Fibonacci數(shù)列)假設(shè)有一對(duì)兔子,一個(gè)月后成長(zhǎng)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年文學(xué)創(chuàng)作證書考試試題與參考答案
- 2026年音樂(lè)基礎(chǔ)知識(shí)與名作賞析試題庫(kù)
- 2026年茶文化專家資格考試筆試題
- 2026年二建考試試題及答案調(diào)研
- 2026年財(cái)務(wù)專業(yè)研究生入學(xué)考試資產(chǎn)評(píng)估專業(yè)試題
- 2026年電氣工程與智能電網(wǎng)技術(shù)進(jìn)階題集
- 2026年鋼琴考級(jí)練習(xí)曲集音階與和弦練習(xí)及演奏技巧
- 2026年管理決策能力測(cè)試模擬經(jīng)營(yíng)案例分析題
- 2025-2026學(xué)年第二學(xué)期初三年級(jí)化學(xué)備課組工作計(jì)劃:夯實(shí)化學(xué)基礎(chǔ)強(qiáng)化實(shí)驗(yàn)操作助力學(xué)生備戰(zhàn)中考
- 2026年國(guó)際貿(mào)易實(shí)務(wù)知識(shí)自測(cè)練習(xí)題
- 10S505 柔性接口給水管道支墩
- 2024年廣東粵電湛江風(fēng)力發(fā)電限公司社會(huì)公開招聘21人公開引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(kù)(共500題)答案詳解版
- 依庫(kù)珠單抗注射液-臨床用藥解讀
- 罷免物業(yè)申請(qǐng)書
- 高血壓的急癥與處理
- 表面粗糙度與檢測(cè)(新國(guó)標(biāo))課件
- 人工智能在系統(tǒng)集成中的應(yīng)用
- 大九九乘法口訣表(可下載打印)
- 金屬非金屬礦山安全操作規(guī)程
- 壓鑄鋁合金熔煉改善
- 排水管道溝槽土方開挖專項(xiàng)方案
評(píng)論
0/150
提交評(píng)論