亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言函數(shù)的遞歸和調(diào)用實例分析

2020-02-24 14:33:31
字體:
供稿:網(wǎng)友

一個函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。這種函數(shù)稱為遞歸函數(shù)。C語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進入新的一層,那接下來跟隨武林技術(shù)小編一起來看下C語言函數(shù)的遞歸和調(diào)用實例分析吧。

一、基本內(nèi)容:

  C語言中的函數(shù)可以遞歸調(diào)用,即:可以直接(簡單遞歸)或間接(間接遞歸)地自己調(diào)自己。
  要點:
  1、C語言函數(shù)可以遞歸調(diào)用。
  2、可以通過直接或間接兩種方式調(diào)用。目前只討論直接遞歸調(diào)用。

二、遞歸條件

  采用遞歸方法來解決問題,必須符合以下三個條件:
  1、可以把要解決的問題轉(zhuǎn)化為一個新問題,而這個新的問題的解決方法仍與原來的解決方法相同,只是所處理的對象有規(guī)律地遞增或遞減。
  說明:解決問題的方法相同,調(diào)用函數(shù)的參數(shù)每次不同(有規(guī)律的遞增或遞減),如果沒有規(guī)律也就不能適用遞歸調(diào)用。
  2、可以應(yīng)用這個轉(zhuǎn)化過程使問題得到解決。
  說明:使用其他的辦法比較麻煩或很難解決,而使用遞歸的方法可以很好地解決問題。
  3、必定要有一個明確的結(jié)束遞歸的條件。
  說明:一定要能夠在適當(dāng)?shù)牡胤浇Y(jié)束遞歸調(diào)用。不然可能導(dǎo)致系統(tǒng)崩潰。

三、遞歸實例

  例:使用遞歸的方法求n!
  當(dāng)n>1時,求n!的問題可以轉(zhuǎn)化為n*(n-1)!的新問題。
  比如n=5:
  第一部分:5*4*3*2*1 n*(n-1)!
  第二部分:4*3*2*1 (n-1)*(n-2)!
  第三部分:3*2*1 (n-2)(n-3)!
  第四部分:2*1 (n-3)(n-4)!
  第五部分:1 (n-5)! 5-5=0,得到值1,結(jié)束遞歸。
  源程序:

復(fù)制代碼 代碼如下:

  fac(int n)
  {int t;
  if(n==1)||(n==0) return 1;
  else
  { t=n*fac(n-1);
  return t;
  }
  }
  main( )
  {int m,y;
  printf(“Enter m:”);
  scanf(“%d”,&m);
  if(m<0) printf(“Input data Error!/n”);
  else
  {y=fac(m);
  printf(“/n%d! =%d /n”,m,y);
  }
  }

四、遞歸說明

  1、當(dāng)函數(shù)自己調(diào)用自己時,系統(tǒng)將自動把函數(shù)中當(dāng)前的變量和形參暫時保留起來,在新一輪的調(diào)用過程中,系統(tǒng)為新調(diào)用的函數(shù)所用到的變量和形參開辟另外的存 儲單元(內(nèi)存空間)。每次調(diào)用函數(shù)所使用的變量在不同的內(nèi)存空間。
  2、遞歸調(diào)用的層次越多,同名變量的占用的存儲單元也就越多。一定要記住,每次函數(shù)的調(diào)用,系統(tǒng)都會為該函數(shù)的變量開辟新的內(nèi)存空間。
  3、當(dāng)本次調(diào)用的函數(shù)運行結(jié)束時,系統(tǒng)將釋放本次調(diào)用時所占用的內(nèi)存空間。程序的流程返回到上一層的調(diào)用點,同時取得當(dāng)初進入該層時,函數(shù)中的變量和形參 所占用的內(nèi)存空間的數(shù)據(jù)。
  4、所有遞歸問題都可以用非遞歸的方法來解決,但對于一些比較復(fù)雜的遞歸問題用非遞歸的方法往往使程序變得十分復(fù)雜難以讀懂,而函數(shù)的遞歸調(diào)用在解決這類 問題時能使程序簡潔明了有較好的可讀性;但由于遞歸調(diào)用過程中,系統(tǒng)要為每一層調(diào)用中的變量開辟內(nèi)存空間、要記住每一層調(diào)用后的返回點、要增加許多額外的 開銷,因此函數(shù)的遞歸調(diào)用通常會降低程序的運行效率。

五、程序流程

復(fù)制代碼 代碼如下:

  fac(int n) /*每次調(diào)用使用不同的參數(shù)*/
  { int t; /*每次調(diào)用都會為變量t開辟不同的內(nèi)存空間*/
  if(n==1)||(n==0) /*當(dāng)滿足這些條件返回1 */
  return 1;
  else
  { t=n*fac(n-1); /*每次程序運行到此處就會用n-1作為參數(shù)再調(diào)用一次本函數(shù),此處是調(diào)用點*/
  return t; /*只有在上一句調(diào)用的所有過程全部結(jié)束時才運行到此處。*/
  }
  }


一個函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。這種函數(shù)稱為遞歸函數(shù)。C語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進入新的一層。例如有函數(shù)f如下:

復(fù)制代碼 代碼如下:

int f(int x)
{
int y;
z=f(y);
return z;
}

這個函數(shù)是一個遞歸函數(shù)。但是運行該函數(shù)將無休止地調(diào)用其自身,這當(dāng)然是不正確的。為了防止遞歸調(diào)用無終止地進行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。下面舉例說明遞歸調(diào)用的執(zhí)行過程。

【例8.5】用遞歸法計算n!

用遞歸法計算n!可用下述公式表示:
n!=1 (n=0,1)
n×(n-1)! (n>1)
按公式可編程如下:
long ff(int n)
{
long f;
if(n<0) printf("n<0,input error");
else if(n==0||n==1) f=1;
else f=ff(n-1)*n;
return(f);
}

main()
{
int n;
long y;
printf("/ninput a inteager number:/n");
scanf("%d",&n);
y=ff(n);
printf("%d!=%ld",n,y);
}

程序中給出的函數(shù)ff是一個遞歸函數(shù)。主函數(shù)調(diào)用ff 后即進入函數(shù)ff執(zhí)行,如果n<0,n==0或n=1時都將結(jié)束函數(shù)的執(zhí)行,否則就遞歸調(diào)用ff函數(shù)自身。由于每次遞歸調(diào)用的實參為n-1,即把n-1的值賦予形參n,最后當(dāng)n-1的值為1時再作遞歸調(diào)用,形參n的值也為1,將使遞歸終止。然后可逐層退回。

下面我們再舉例說明該過程。設(shè)執(zhí)行本程序時輸入為5,即求5!。在主函數(shù)中的調(diào)用語句即為y=ff(5),進入ff函數(shù)后,由于n=5,不等于0或1,故應(yīng)執(zhí)行f=ff(n-1)*n,即f=ff(5-1)*5。該語句對ff作遞歸調(diào)用即ff(4)。

進行四次遞歸調(diào)用后,ff函數(shù)形參取得的值變?yōu)?,故不再繼續(xù)遞歸調(diào)用而開始逐層返回主調(diào)函數(shù)。ff(1)的函數(shù)返回值為1,ff(2)的返回值為1*2=2,ff(3)的返回值為2*3=6,ff(4)的返回值為6*4=24,最后返回值ff(5)為24*5=120。

例8.5也可以不用遞歸的方法來完成。如可以用遞推法,即從1開始乘以2,再乘以3…直到n。遞推法比遞歸法更容易理解和實現(xiàn)。但是有些問題則只能用遞歸算法才能實現(xiàn)。典型的問題是Hanoi塔問題。

【例8.6】Hanoi塔問題
一塊板上有三根針,A,B,C。A針上套有64個大小不等的圓盤,大的在下,小的在上。如圖5.4所示。要把這64個圓盤從A針移動C針上,每次只能移動一個圓盤,移動可以借助B針進行。但在任何時候,任何針上的圓盤都必須保持大盤在下,小盤在上。求移動的步驟。

本題算法分析如下,設(shè)A上有n個盤子。

如果n=1,則將圓盤從A直接移動到C。

如果n=2,則:
1.將A上的n-1(等于1)個圓盤移到B上;
2.再將A上的一個圓盤移到C上;
3.最后將B上的n-1(等于1)個圓盤移到C上。

如果n=3,則:
A. 將A上的n-1(等于2,令其為n`)個圓盤移到B(借助于C),步驟如下:
(1)將A上的n`-1(等于1)個圓盤移到C上。
(2)將A上的一個圓盤移到B。
(3)將C上的n`-1(等于1)個圓盤移到B。
B. 將A上的一個圓盤移到C。
C. 將B上的n-1(等于2,令其為n`)個圓盤移到C(借助A),步驟如下:
(1)將B上的n`-1(等于1)個圓盤移到A。
(2)將B上的一個盤子移到C。
(3)將A上的n`-1(等于1)個圓盤移到C。

到此,完成了三個圓盤的移動過程。

從上面分析可以看出,當(dāng)n大于等于2時,移動的過程可分解為三個步驟:
第一步 把A上的n-1個圓盤移到B上;
第二步 把A上的一個圓盤移到C上;
第三步 把B上的n-1個圓盤移到C上;其中第一步和第三步是類同的。

當(dāng)n=3時,第一步和第三步又分解為類同的三步,即把n`-1個圓盤從一個針移到另一個針上,這里的n`=n-1。 顯然這是一個遞歸過程,據(jù)此算法可編程如下:
move(int n,int x,int y,int z)
{
if(n==1)
printf("%c-->%c/n",x,z);
else
{
move(n-1,x,z,y);
printf("%c-->%c/n",x,z);
move(n-1,y,x,z);
}
}
main()
{
int h;
printf("/ninput number:/n");
scanf("%d",&h);
printf("the step to moving %2d diskes:/n",h);
move(h,'a','b','c');
}

從程序中可以看出,move函數(shù)是一個遞歸函數(shù),它有四個形參n,x,y,z。n表示圓盤數(shù),x,y,z分別表示三根針。move 函數(shù)的功能是把x上的n個圓盤移動到z上。當(dāng)n==1時,直接把x上的圓盤移至z上,輸出x→z。如n!=1則分為三步:遞歸調(diào)用move函數(shù),把n-1個圓盤從x移到y(tǒng);輸出x→z;遞歸調(diào)用move函數(shù),把n-1個圓盤從y移到z。在遞歸調(diào)用過程中n=n-1,故n的值逐次遞減,最后n=1時,終止遞歸,逐層返回。當(dāng)n=4 時程序運行的結(jié)果為:
input number:
4
the step to moving 4 diskes:
a→b
a→c
b→c
a→b
c→a
c→b
a→b
a→c
b→c
b→a
c→a
b→c
a→b
a→c
b→c

以上就是C語言函數(shù)的遞歸和調(diào)用實例分析,更多精彩內(nèi)容,盡在https://js.Vevb.com。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

亚洲色图一二三区| 老太做爰xxxx| 少妇精品久久久久久久久久| 国产精品日本欧美一区二区三区| 久久久777精品电影网影网| 久久九九国产视频| 欧美成人69av| 欧美午夜www高清视频| 国产女同91疯狂高潮互磨| 欧美一级在线免费观看| 精品成人国产| 色在线视频观看| 亚洲av无码国产精品久久| 中文字幕乱码久久午夜不卡| 久久精品成人欧美大片免费| 激情文学综合插| 欧洲美女日日| 狼人天天伊人久久| 国产精品一区二区不卡| 自己做鸭怎么接单寻找客源| 茄子视频成人免费观看| 图片小说视频色综合| 2018av在线| 欧美黄网站色视频| 神马一区二区影院| 欧美综合影院| 91视频久久| 成年人免费在线视频网站| 国产成人精品久久一区二区小说| 艳妇臀荡乳欲伦亚洲一区| 亚洲女则毛耸耸bbw| 日本高清免费电影一区| 91亚洲精品乱码久久久久久蜜桃| 国产激情999| 天堂在线www天堂中文在线| a天堂中文在线官网| 中文字幕日韩电影| 亚洲精品日韩激情在线电影| 久久在精品线影院精品国产| 亚洲国产精品99| 日韩欧美中文字幕视频| 九九热在线免费视频| 天天插天天射天天干| 亚洲一卡2卡三卡4卡2021四卡| 国产高清视频一区三区| 日本欧美一二三区| 日本免费在线观看视频| 天堂а√在线资源在线| 中文字幕制服诱惑| 亚洲va欧美va天堂v国产综合| 亚洲色图欧洲色图婷婷| 欧美日韩亚洲在线观看| av一区二区三区在线| 国产香蕉在线视频| 久久久亚洲国产美女国产盗摄| 日日噜噜夜夜狠狠视频| 国产ts变态重口人妖hd| 电影午夜精品一区二区三区| 日韩亚洲欧美高清| 99热在线精品观看| xxx国产在线观看| 国产九色视频| 日本黄色一级网站| 欧美女优在线视频| 人人妻人人澡人人爽久久av| 精品国产一区二区三区不卡| 欧美日韩网址| 亚洲国产成人私人影院| 亚洲欧美日韩图片| 国产乱码精品一品二品| 黄色网战在线观看| 中文字幕高清在线观看| 国产成人无码精品久在线观看| 国产精品igao网网址不卡| 日韩08精品| 夜夜夜夜夜夜操| 瑟瑟在线观看| 欧美一区二区三区在线免费观看| 日韩欧美视频在线| 亚洲av无码片一区二区三区| 国产精品一级二级| eeuss影院www| 忘忧草在线影院两性视频| 懂色av一区二区在线播放| 在线观看日韩专区| 91在线观看免费网站| 中文字幕区一区二区三| 九色综合日本| 国精产品一区一区三区mba视频| 日韩在线免费av| 日韩亚洲国产免费| 亚洲午夜精品视频| 一区二区三区免费在线看| 本田岬高潮一区二区三区| 色呦呦中文字幕| 国际av在线| 亚洲成色777777在线观看影院| 香蕉久久一区二区三区| 欧美重口另类videos人妖| 久久久精品网| 国产女人水真多18毛片18精品视频| 亚久久调教视频| 国产成人的电影在线观看| 天天操天天干天天| 久久一区二区三区欧美亚洲| 日韩激情视频一区二区| 少妇人妻精品一区二区三区| 福利视频午夜| 午夜亚洲福利在线老司机| 捆绑紧缚一区二区三区在线观看| 99这里有精品视频| 日本高清不卡一区二区三区视频| 久热精品视频在线观看一区| 女人黄色一级片| 在线中文av| 九九在线高清精品视频| 亚洲av毛片成人精品| 99久久婷婷国产综合精品电影| 欧美 另类 交| 欧美在线一级视频| 日韩电影在线观看永久视频免费网站| 日韩精品一区二区在线| 亚欧精品在线视频| 91成人国产| 欧美在线视频在线播放完整版免费观看| 视频三区在线观看| 99v久久综合狠狠综合久久| 精品免费久久久| 精品国产福利一区二区在线| 国产老女人精品毛片久久| www色aa色aawww| 欧美狂欢多p性派对| 亚洲精品久久久狠狠狠爱| 欧美一区二区三区另类| 性欧美8khd高清极品| 国产精品电影一区| 日韩av一卡二卡| 一本高清dvd不卡在线观看| 亚洲欧美国产高清va在线播| 99久久99久久精品国产片果冰| 日日爽夜夜爽| 91久久久久久久久久久久久| 在线电影av| 亚洲一区二区免费在线观看| 欧美aaa一级片| 无码人妻一区二区三区精品视频| 6080yy精品一区二区三区| 黄色小视频免费在线观看| 四虎4hutv紧急入口| 尤物九九久久国产精品的分类| 人人爽人人爽av| 欧美综合77777色婷婷| 国产精品久久网站| 麻豆成人av| 久久草.com| caoporn免费在线| 日产中文字幕在线精品一区| 日韩黄色三级在线观看| 人妻互换一区二区激情偷拍| 日日摸日日搞日日| 成人免费视频网| 深夜国产在线播放| 国产人妻人伦精品1国产丝袜| 欧美视频一区二区三区| 精品国产二区三区| 亚洲一区二区少妇| 天堂中文资源在线观看| 97高清免费视频| 欧美日韩免费精品| 亚洲一区二区三区中文字幕在线观看| 成年女人午夜毛片免费看| 美女视频久久黄| 国产麻豆精品久久| 色婷婷一区二区三区在线观看| 国产男女猛烈无遮挡a片漫画| 中文字幕一二三| 亚洲伦理久久| 色呦呦在线免费观看| 久久精品偷拍视频| 黄色一级视频免费| 日韩精品人妻中文字幕有码| 99久久久国产精品| 啊啊啊啊啊啊啊视频在线播放| 日本人妻丰满熟妇久久久久久| 波多野结衣在线高清| 成人福利视频在线| 亚洲婷婷综合网| 在线看片国产福利你懂的| 欧美在线看片| 懂色av一区二区三区免费观看| 日本午夜在线亚洲.国产| 香港成人在线视频| 一本色道久久综合亚洲精品图片| 国产精品久久久久久久久免费桃花| 日本福利视频在线观看| 91av一区| 深夜福利亚洲导航| 日韩欧美亚洲精品| 亚洲色图二区| 亚洲综合色丁香婷婷六月图片| 亚洲色图视频免费播放| 国产成在线观看免费视频| 成人在线视频网址| 欧美视频一区二区三区四区| 伊人一区二区三区| 高清视频在线观看三级| 亚洲一区色图| 欧美婷婷六月丁香综合色| 日本一区福利在线| 亚洲va欧美va国产综合剧情| 日韩av中文字幕一区二区| 黄色动漫免费看| 黄色免费成人| 欧美一区二区播放| 欧美日韩在线看| 西野翔中文久久精品国产| 国产亚洲精品久久久久久无几年桃| 成人毛片免费在线观看| 成人久久久精品国产乱码一区二区| 在线观看国产精品淫| 日韩理论片在线| 国产亚洲午夜高清国产拍精品| 啪啪av大全导航福利综合导航| 中文字幕不卡在线视频极品| 国产 中文 字幕 日韩 在线| 伊人影院久久| 伊人伊人伊人久久| 欧美黄色免费影院| 久88久久88久久久| 欧美另类videos| 美女露胸视频在线观看| 四虎精品一区二区| 国产成人香蕉在线视频fuz| 国产成人精品亚洲日本在线桃色| 黄色美女一级片| 国产精品成人无码专区| 午夜精品国产| 一二三四视频免费观看在线看| 欧美激情一区二区三区成人| 国产精品第1页| 久久精品人人做人人爽97| 色狠狠av一区二区三区香蕉蜜桃| 无码人妻av一区二区三区波多野| 男人午夜视频在线观看| 国产亚洲综合性久久久影院| 你懂的在线观看视频| 91欧美激情另类亚洲| www.蜜臀av| 99国产精品免费网站| 丰满人妻一区二区三区53号| 欧美日本国产视频| 亚洲精华国产精华精华液网站| 日本亚洲视频在线| 无码人妻aⅴ一区二区三区有奶水| 色播久久人人爽人人爽人人片视av| 久久久久久久一区二区| 丝袜亚洲欧美日韩综合| av不卡免费电影| jizz在线观看视频| 国内伊人久久久久久网站视频| 少妇视频在线播放| 欧美一区二区三区婷婷| 国产www网站| 极品少妇xxxx偷拍精品少妇| 伊人久久大香线蕉精品组织观看| 精品欧美一区二区久久久久| 色视频欧美一区二区三区| 久热久精久品这里在线观看| 日韩欧美精品在线| 亚洲 日韩 国产第一| 国产精品久久人| 美国一级片在线观看| 成人自拍视频在线| 国产日产亚洲精品系列| 乳色吐息在线观看| 在线观看av网站永久| 丁香久久五月| 91精品综合久久久久久| 国产激情久久久久| 色婷婷综合久久久中文字幕| 国产传媒欧美日韩成人精品大片| 久久这里精品| 色网站在线免费观看| 欧美电影免费观看完整版| 国产午夜精品久久久久久久久| 国产性xxxx高清| 国产av人人夜夜澡人人爽麻豆| 第一会所亚洲原创| 国产91精品一区二区| 2023亚洲男人天堂| 伊人久久综合网另类网站| 美女视频黄是免费| 无码人妻丰满熟妇区毛片| 日韩精品电影在线| h小视频在线观看网| a4yy在线播放免费观看视频| 国产精品久久久久久久久毛片| 一区二区在线观看免费| 亚洲一区亚洲二区| 69**夜色精品国产69乱| 蜜臀99久久精品久久久久久软件| 欧美人与牲动交xxxxbbbb| 日日碰狠狠丁香久燥| 久久视频www| 国产精品999久久久| 亚洲国内精品| 欧美1区2区视频| 欧美xxxxxxxxx59| 日本特级黄色片| 中文字幕 人妻熟女| 91福利视频免费观看| 午夜精品一区二区三区三上悠亚| 亚洲茄子视频| 国产一区二区精品久久91| 99精品久久久| 亚洲欧美日韩综合网| 亚洲人成无码网站久久99热国产| 2001个疯子在线观看| 亚洲精品永久免费视频| 精品av综合导航| 性猛交xxxx乱大交孕妇印度| 92国产精品久久久久首页| 中文字幕国产在线| 欧美精品在欧美一区二区少妇| 麻豆传媒在线完整视频| 国产一区二区中文| www.欧美精品一二区| av在线免费在线观看|