![函數(shù)嵌套調(diào)用和遞歸調(diào)用_第1頁](http://file4.renrendoc.com/view10/M01/2E/11/wKhkGWWV1KmAdUXkAADjcfvk9cc035.jpg)
![函數(shù)嵌套調(diào)用和遞歸調(diào)用_第2頁](http://file4.renrendoc.com/view10/M01/2E/11/wKhkGWWV1KmAdUXkAADjcfvk9cc0352.jpg)
![函數(shù)嵌套調(diào)用和遞歸調(diào)用_第3頁](http://file4.renrendoc.com/view10/M01/2E/11/wKhkGWWV1KmAdUXkAADjcfvk9cc0353.jpg)
![函數(shù)嵌套調(diào)用和遞歸調(diào)用_第4頁](http://file4.renrendoc.com/view10/M01/2E/11/wKhkGWWV1KmAdUXkAADjcfvk9cc0354.jpg)
![函數(shù)嵌套調(diào)用和遞歸調(diào)用_第5頁](http://file4.renrendoc.com/view10/M01/2E/11/wKhkGWWV1KmAdUXkAADjcfvk9cc0355.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《C語言程序設(shè)計(jì)》學(xué)習(xí)內(nèi)容:函數(shù)的嵌套調(diào)用和遞歸調(diào)用6.9函數(shù)的嵌套調(diào)用和遞歸調(diào)用引例編程函數(shù)求解:
y=(x+y)2!然后調(diào)用函數(shù)求解(2+3)2!以及(3+4)2!要求:
1、首先編寫求和函數(shù),求解x+y的和。
2、編寫函數(shù)求解(x+y)
的平方(x+y)2
3、編寫函數(shù)求解(x+y)2!main(){int
a,b,c;
scanf(“%d,%d”,&a,&b);
jc(a,b);
printf(“sumis%d",c);}int
jc(intk,intj){int
z,m,i,s=1;
sum(k,j);
pf(z);
for(i=1;i<=m;i++)s=s*i;
returns;}int
sum(intx,inty){
return(x+y);}intpf(inth){
return(h*h);}c=z=m=6.9.1函數(shù)的嵌套調(diào)用C語言中不允許嵌套的函數(shù)定義,各函數(shù)之間是平行的,不存在上一級(jí)函數(shù)和下一級(jí)函數(shù)的問題。voidprint(){
putchar('*');
voidprnline(intn){inti;
for(i=0;i<=n;i++)
putchar('\n');}}C語言允許在一個(gè)函數(shù)的定義中出現(xiàn)對(duì)另一個(gè)函數(shù)的調(diào)用(使用)。這樣就出現(xiàn)了函數(shù)的嵌套調(diào)用,即在被使用函數(shù)中又調(diào)用其他函數(shù)。#include<stdio.h>
longsum(inta,intb);longfactorial(intn);main(){intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);
printf("a=%1d",a);}longsum(int
a,intb){longc1,c2;
factorial(a);
factorial(b);
return(c1+c2);}
longfactorial(intn){longrtn=1;
inti;for(i=1;i<=n;i++)
rtn*=i;
return(rtn);}longsum(inta,intb);longfactorial(intn);文件包含編譯預(yù)處理命令函數(shù)聲明函數(shù)定義函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)返回值形參實(shí)參c1=c2=
longfactorial(intn){longrtn=1;
inti;for(i=1;i<=n;i++)
rtn*=i;
return(rtn);}例2求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值#include<stdio.h>
int
dif(int
x,int
y,intz);
int
max(int
x,int
y,intz);
int
min(int
x,int
y,intz);voidmain(){int
a,b,c,d;
scanf("%d%d%d",&a,&b,&c);
d=dif(a,b,c);
printf("Max-Min=%d\n",d);}int
min(int
x,int
y,intz){intr;r=x<y?x:y;
return(r<z?r:z);}int
max(int
x,int
y,intz){intr;r=x>y?x:y;
return(r>z?r:z);}int
dif(int
x,int
y,intz){returnmax(x,y,z)-min(x,y,z);}
f(x+y)2x+y(x<=y)
g(x,y)=f(x-y)2x+y(x>y)
其中:f(t)=(1+e-t)/(1+et)求result=g(2.5,3.4)。練習(xí)練習(xí)例:編寫求組合數(shù)的函數(shù)。6.9.2函數(shù)的遞歸調(diào)用
遞歸:
一個(gè)函數(shù)直接或間接地使用自身。
1.直接遞歸調(diào)用:函數(shù)直接調(diào)用本身
2.間接遞歸調(diào)用:函數(shù)間接調(diào)用本身int
f(intx){inty,z;……
z=f(y);…….return(2*z);}int
f1(intx){inty,z;……
z=f2(y);…….return(2*z);}int
f2(intt){inta,c;……
c=f1(a);…….return(3+c);}直接調(diào)用間接調(diào)用【例1】有5個(gè)人,第5個(gè)人說他比第4個(gè)人大2歲,第4個(gè)人說他對(duì)第3個(gè)人大2歲,第3個(gè)人說他對(duì)第2個(gè)人大2歲,第2個(gè)人說他比第1個(gè)人大2歲,第1個(gè)人說他10歲。求第5個(gè)人多少歲。通過分析,設(shè)計(jì)遞歸函數(shù)如下:
10(n=1)age(n)=age(n-1)+2(n>1)遞歸函數(shù):
10(n=1)age(n)=age(n-1)+2(n>1)age(intn){
intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}main(){
intx;x=age(5);
printf("%d",x);}程序如下:請(qǐng)看看單步運(yùn)行的情況……
age(5)
c=age(4)+2;
returnc;age(intn){
intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}遞歸過程跟蹤分析:
age(4)
c=age(3)+2;
returnc;
age(3)
c=age(2)+2;
returnc;
age(2)
c=age(1)+2;
returnc;
age(1)
c=10
returnc;c=10c=12c=14c=16c=18main(){
intx;age(3);
printf("%d",x);}age(intn){
intc;
elsereturnc;}3age(n-1)2age(intn){
intc;
elsereturnc;}2age(n-1)1age(intn){
intc;if(n==1)c=10;
returnc;}1c=+2+2c=x=總結(jié):遞歸算法遞歸函數(shù)名f(參數(shù)x){if(x==初值)//遞歸結(jié)束的條件
結(jié)果=…;else
結(jié)果=含f(x-1)的表達(dá)式;返回結(jié)果(return);}f(n){f(n-1)
}main(){f(n)…}f(n-1){f(n-2)
}f(n-2){f(n-3)
}f(1或者0){f(0)==…)
}例2:用遞歸算法計(jì)算n!n!=n*(n-1)!(n-1)!=(n-1)*(n-2)!…..5!=5*4!4!=4*3!3!=3*2!2!=2*1!1!=1
longjc(intn){longk;
if(n==1)k=1;elsek=n*jc(n-1);returnk;}main(){longx;x=jc(6);
printf("%ld",x);}
longjc(intn){longk;
inti;
for(i=1;i<=n;i++)k=k*i;returnk;}main(){longx;x=jc(6);
printf("%ld",x);}
例3、用遞歸法計(jì)算Fibonacci序列的第20項(xiàng)。f=1n=1或者n=2f(n-1)+f(n-2)n>2
根據(jù)數(shù)學(xué)公式,很容易將n階的問題轉(zhuǎn)化成n-1階和n-2階的問題,即:f(n)=f(n-1)+f(n-2),遞歸出口:n=1或者n=2。程序如下:#include"stdio.h"int
fib(intn){if((n==1)||(n==2))return1;elsereturn(fib(n-1)+fib(n-2));}main(){
inti;
printf("\n");
printf("%d",fib(20));}例4:
漢諾塔(Hanoi)問題BC問題:
將A塔上n個(gè)盤子移至C(借助于B)。移動(dòng)時(shí),保證三個(gè)塔始終是大盤在下,小盤在上。An個(gè)盤子必須用遞歸方式解決,將n階問題轉(zhuǎn)為n-1階:1)
先將A塔n–1個(gè)盤子借助于C移至B上:2)將A上剩下的一個(gè)移至C上.3)
將B上n–1個(gè)盤子借助于A移至C上.可以看到:1)、3)為同一問題,都為n–1個(gè)盤子借助于一個(gè)空塔移至另一塔上。遞歸出口:n=1,此時(shí)A座上只有一個(gè)盤子,直接將其移動(dòng)到C座上即可。
#include"stdio.h"voidmove(intn,charx,chary,charz){if(n==1)
printf("%c-->%c\n",x,z);else{move(n-1,x,z,y);//n-1盤子已經(jīng)到y(tǒng)上
printf("%c-->%c\n",x,z);move(n-1,y,x,z);//y上n-1盤子想辦法放到z}}
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基建科工程施工范本合同
- 三農(nóng)村人居環(huán)境整治實(shí)施方案
- 公務(wù)車輛定點(diǎn)維修合同
- 法人向公司借款合同
- 經(jīng)典房地產(chǎn)開發(fā)的合同
- 編程語言高級(jí)應(yīng)用作業(yè)指導(dǎo)書
- 養(yǎng)殖業(yè)專業(yè)作業(yè)指導(dǎo)書
- 企業(yè)智能核能技術(shù)與應(yīng)用作業(yè)指導(dǎo)書
- 軟件技術(shù)開發(fā)與測(cè)試作業(yè)指導(dǎo)書
- 高港區(qū)二手房買賣合同
- 青海省西寧市海湖中學(xué)2025屆中考生物仿真試卷含解析
- 2024年河南省《輔警招聘考試必刷500題》考試題庫(kù)及答案【全優(yōu)】
- -情景交際-中考英語復(fù)習(xí)考點(diǎn)
- 安全隱患報(bào)告和舉報(bào)獎(jiǎng)勵(lì)制度
- 地理標(biāo)志培訓(xùn)課件
- 2023行政主管年終工作報(bào)告五篇
- 2024年中國(guó)養(yǎng)老產(chǎn)業(yè)商學(xué)研究報(bào)告-銀發(fā)經(jīng)濟(jì)專題
- GA/T 1003-2024銀行自助服務(wù)亭技術(shù)規(guī)范
- 公園衛(wèi)生保潔考核表
- 培訓(xùn)如何上好一堂課
- 2024醫(yī)療銷售年度計(jì)劃
評(píng)論
0/150
提交評(píng)論