c語(yǔ)言函數(shù)遞歸調(diào)用_第1頁(yè)
c語(yǔ)言函數(shù)遞歸調(diào)用_第2頁(yè)
c語(yǔ)言函數(shù)遞歸調(diào)用_第3頁(yè)
c語(yǔ)言函數(shù)遞歸調(diào)用_第4頁(yè)
c語(yǔ)言函數(shù)遞歸調(diào)用_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

c語(yǔ)言函數(shù)遞歸調(diào)用在調(diào)用一個(gè)函數(shù)的過(guò)程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,這種用法稱為函數(shù)的遞歸調(diào)用。例如:intf(intx){intx,z;z=f(x);//在執(zhí)行f函數(shù)的過(guò)程中又要調(diào)用f函數(shù)return(2+z);}在調(diào)用函數(shù)f的過(guò)程中,又要調(diào)用f函數(shù)(本函數(shù)),這是直接調(diào)用本函數(shù)。如果在調(diào)用f1函數(shù)過(guò)程中要調(diào)用f2函數(shù),又在調(diào)用f2的數(shù)過(guò)程中又要調(diào)用f1,這就是間接調(diào)用本函數(shù)。這兩種遞歸調(diào)用都是無(wú)終正的自身調(diào)用,程序中不應(yīng)出現(xiàn)這種無(wú)終止的遞歸調(diào)用,只應(yīng)出現(xiàn)有限次數(shù)的、有終止的遞歸調(diào)用,用if語(yǔ)句來(lái)控制,只有在某一條件成立時(shí)才繼續(xù)執(zhí)行遞歸調(diào)用:否則就不再繼續(xù)。如n=1;c=10,沒(méi)有條件一直調(diào)用,有條件把遞歸調(diào)用變已知值,無(wú)調(diào)用函數(shù),消失了。例:有5個(gè)學(xué)生坐在一起,問(wèn)第5個(gè)學(xué)生多少歲,他說(shuō)比第4個(gè)學(xué)生大2歲,問(wèn)第4個(gè)學(xué)生歲數(shù),他說(shuō)比第3個(gè)學(xué)生大2歲。問(wèn)第3個(gè)學(xué)生,又說(shuō)比第2個(gè)學(xué)生大2歲,問(wèn)第2個(gè)學(xué)生,說(shuō)比第1個(gè)學(xué)生大2歲。最后問(wèn)第1個(gè)學(xué)生,他說(shuō)是10歲。請(qǐng)問(wèn)第5個(gè)學(xué)生多大。每一個(gè)學(xué)生的年齡都比其前1個(gè)學(xué)生的年齡大2。說(shuō)明共用一個(gè)函數(shù)關(guān)系。可以用數(shù)學(xué)公式表述如下:age(n)=10(n=1)age(n)=age(n-1)+2(n>1)當(dāng)n>1時(shí),不斷調(diào)用同一個(gè)函數(shù),就是一個(gè)遞歸問(wèn)題?;厮輰⒌?個(gè)學(xué)生的年齡表示直到第1個(gè)學(xué)生的年齡。此時(shí)age(1)已知等于10,沒(méi)有可調(diào)用函數(shù),出現(xiàn)已知值,不再出現(xiàn)調(diào)用。從第1個(gè)學(xué)生的已知年齡推算出第2個(gè)學(xué)生的年齡(12歲),一直推算出第5個(gè)學(xué)生的年齡18歲為止。如果要求遞歸過(guò)程不是無(wú)限制進(jìn)行下去,必須具有一個(gè)結(jié)束遞歸過(guò)程的條件。就是要出現(xiàn)已知值,不再調(diào)用下去。如:age(1)=10,就是使遞歸結(jié)束的條件,出現(xiàn)已知值,不再調(diào)用了,也就終止遞歸了。編寫程序:用一個(gè)函數(shù)來(lái)描述上述遞歸過(guò)程:intage(intn)//求年齡的遞歸函數(shù),內(nèi)有調(diào)用自身的函數(shù)。{intc;if(n==1)c=10∥這里c=age(1),并不等于age(5)elsec=age(n-1)+2;return(c);//c用作存放函數(shù)的返回值的變量用一個(gè)主函數(shù)調(diào)用age函數(shù),求得第5個(gè)學(xué)生的年齡。程序如下:#include<stdio.h>intmain()∥函數(shù)名不用分號(hào),因?yàn)楹兞棵c大括號(hào)實(shí)體內(nèi)容是一體,不可分離,不用分號(hào),內(nèi)部也是連接的,不用逗號(hào)。{intage(intn);//對(duì)age函數(shù)的聲明,臨時(shí)變量只用主函數(shù)對(duì)調(diào)用函數(shù)變量定義類型非void非任意類型printf("No.5.age:%d\n",age(5));//輸出第5個(gè)學(xué)生的年齡return0;}intage(intn)//自定義遞歸函數(shù),給調(diào)用時(shí)創(chuàng)造空間,調(diào)用結(jié)束時(shí)立即釋放空間,依靠主函數(shù)定義的臨時(shí)變量存放空間。{intc;if(n==1)c=10;//如果n等于1,年齡為10,控制遞歸調(diào)用進(jìn)度,當(dāng)遞歸函數(shù)推進(jìn)n=1時(shí),停止。else//如果n不等于1//年齡是前一個(gè)學(xué)生的年齡加2c=age(n-1)+2;return(c);}main函數(shù)中age函數(shù)共被調(diào)用5次,即age(5)、age(4)、age(3)、age(2)、age(1)。其中age(5)是main函數(shù)調(diào)用的,其余4次是在age函數(shù)中調(diào)用自己的,即遞歸調(diào)用4次。在某一次調(diào)用age函數(shù)時(shí)并不是立即得到age(n)的確定值,而是一次又一次地進(jìn)行遞歸調(diào)用,到age(1)時(shí)才有確定的值,然后再遞推出age(2)、age(3)、age(4)、age(5)。age(1)=10作為遞歸的終止條件,使遞歸消失。當(dāng)n等于2時(shí),應(yīng)執(zhí)行“c=age(n-1)+2;”,由于n=2.它相當(dāng)于“c=age(1)+2;”。注意age(1)的值,此時(shí)n=1,應(yīng)執(zhí)行“c=10=age(1)”,即不再遞歸調(diào)用age函數(shù)了,沒(méi)有調(diào)用自身的函數(shù)了,遞歸調(diào)用也就結(jié)束。依此類推,可以得到age(5)值為18。用遞歸方法求n!。求n!可以用遞推方法,遞推法的特點(diǎn)是從一個(gè)已知的事實(shí)(如1!=1)出發(fā),按一定規(guī)律推出下一個(gè)事實(shí)(如2!=1!*2),再?gòu)倪@個(gè)新的已知的事實(shí)出發(fā),再向下推出一個(gè)新的事實(shí)(3!=3*2!)。n!=n*(n-1)!求n!也可以用遞歸方法,即5!等于4?。?,而4=3?。?,…1!=1。可用下面的遞歸公式表示:編寫程序:#include<stdio.h>intmain(){intfac(intn);∥fac函數(shù)聲明intn;inty;printf("inputaintegernumber:");scanf("%d",&n);//這里n可改變,不固定值,將程序變?yōu)橥ㄓ贸绦?,調(diào)用參數(shù)n任意整數(shù)。y=fac(n);調(diào)用n變量空間值printf("%d!=%d\n",n,y);//分取提取n值為n!,提取y值,變?yōu)閥=f(n),執(zhí)行調(diào)用,調(diào)用函數(shù)具有遞歸功能。intfac(intn)//自定義調(diào)用函數(shù)及參變量intf;if(n<0)printf("n<0,dataerror");elseif(n==0n==1)f=1;elsef=fac(n-1)*n;return(f);}每次調(diào)用fac函數(shù)后,其返回值應(yīng)返回到調(diào)用fac函數(shù)處。例如當(dāng)n=2時(shí),從函數(shù)體中可以看到“f=fac(1)*2”,再調(diào)用fac(1),返回值為

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論