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

下載本文檔

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

文檔簡介

c語言函數(shù)遞歸調(diào)用在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,這種用法稱為函數(shù)的遞歸調(diào)用。例如:intf(intx){intx,z;z=f(x);//在執(zhí)行f函數(shù)的過程中又要調(diào)用f函數(shù)return(2+z);}在調(diào)用函數(shù)f的過程中,又要調(diào)用f函數(shù)(本函數(shù)),這是直接調(diào)用本函數(shù)。如果在調(diào)用f1函數(shù)過程中要調(diào)用f2函數(shù),又在調(diào)用f2的數(shù)過程中又要調(diào)用f1,這就是間接調(diào)用本函數(shù)。這兩種遞歸調(diào)用都是無終正的自身調(diào)用,程序中不應(yīng)出現(xiàn)這種無終止的遞歸調(diào)用,只應(yīng)出現(xiàn)有限次數(shù)的、有終止的遞歸調(diào)用,用if語句來控制,只有在某一條件成立時才繼續(xù)執(zhí)行遞歸調(diào)用:否則就不再繼續(xù)。如n=1;c=10,沒有條件一直調(diào)用,有條件把遞歸調(diào)用變已知值,無調(diào)用函數(shù),消失了。例:有5個學(xué)生坐在一起,問第5個學(xué)生多少歲,他說比第4個學(xué)生大2歲,問第4個學(xué)生歲數(shù),他說比第3個學(xué)生大2歲。問第3個學(xué)生,又說比第2個學(xué)生大2歲,問第2個學(xué)生,說比第1個學(xué)生大2歲。最后問第1個學(xué)生,他說是10歲。請問第5個學(xué)生多大。每一個學(xué)生的年齡都比其前1個學(xué)生的年齡大2。說明共用一個函數(shù)關(guān)系??梢杂脭?shù)學(xué)公式表述如下:age(n)=10(n=1)age(n)=age(n-1)+2(n>1)當(dāng)n>1時,不斷調(diào)用同一個函數(shù),就是一個遞歸問題。回溯將第5個學(xué)生的年齡表示直到第1個學(xué)生的年齡。此時age(1)已知等于10,沒有可調(diào)用函數(shù),出現(xiàn)已知值,不再出現(xiàn)調(diào)用。從第1個學(xué)生的已知年齡推算出第2個學(xué)生的年齡(12歲),一直推算出第5個學(xué)生的年齡18歲為止。如果要求遞歸過程不是無限制進行下去,必須具有一個結(jié)束遞歸過程的條件。就是要出現(xiàn)已知值,不再調(diào)用下去。如:age(1)=10,就是使遞歸結(jié)束的條件,出現(xiàn)已知值,不再調(diào)用了,也就終止遞歸了。編寫程序:用一個函數(shù)來描述上述遞歸過程: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ù)的返回值的變量用一個主函數(shù)調(diào)用age函數(shù),求得第5個學(xué)生的年齡。程序如下:#include<stdio.h>intmain()∥函數(shù)名不用分號,因為函變量名與大括號實體內(nèi)容是一體,不可分離,不用分號,內(nèi)部也是連接的,不用逗號。{intage(intn);//對age函數(shù)的聲明,臨時變量只用主函數(shù)對調(diào)用函數(shù)變量定義類型非void非任意類型printf("No.5.age:%d\n",age(5));//輸出第5個學(xué)生的年齡return0;}intage(intn)//自定義遞歸函數(shù),給調(diào)用時創(chuàng)造空間,調(diào)用結(jié)束時立即釋放空間,依靠主函數(shù)定義的臨時變量存放空間。{intc;if(n==1)c=10;//如果n等于1,年齡為10,控制遞歸調(diào)用進度,當(dāng)遞歸函數(shù)推進n=1時,停止。else//如果n不等于1//年齡是前一個學(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ù)時并不是立即得到age(n)的確定值,而是一次又一次地進行遞歸調(diào)用,到age(1)時才有確定的值,然后再遞推出age(2)、age(3)、age(4)、age(5)。age(1)=10作為遞歸的終止條件,使遞歸消失。當(dāng)n等于2時,應(yīng)執(zhí)行“c=age(n-1)+2;”,由于n=2.它相當(dāng)于“c=age(1)+2;”。注意age(1)的值,此時n=1,應(yīng)執(zhí)行“c=10=age(1)”,即不再遞歸調(diào)用age函數(shù)了,沒有調(diào)用自身的函數(shù)了,遞歸調(diào)用也就結(jié)束。依此類推,可以得到age(5)值為18。用遞歸方法求n!。求n!可以用遞推方法,遞推法的特點是從一個已知的事實(如1!=1)出發(fā),按一定規(guī)律推出下一個事實(如2!=1!*2),再從這個新的已知的事實出發(fā),再向下推出一個新的事實(3!=3*2!)。n!=n*(n-1)!求n!也可以用遞歸方法,即5!等于4?。?,而4=3?。?,…1!=1??捎孟旅娴倪f歸公式表示:編寫程序:#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ù)體中可以看到“f=fac(1)*2”,再調(diào)用fac(1),返回值為

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論