Linux C学习---递归函数
最近學(xué)習(xí)到了遞歸,剛開(kāi)始看,真是頭大,函數(shù)里面嵌套其本身,到底是怎么個(gè)流程啊?
現(xiàn)在,咱們先了解下遞歸函數(shù)的數(shù)學(xué)原理:
高中的時(shí)候就出現(xiàn)很多遞歸函數(shù),應(yīng)該是在“級(jí)數(shù)”那里的習(xí)題中出現(xiàn)的,而且還不少。還是從例子開(kāi)始吧:?
f(x)=f(x-1)+x*x ,其中x>0且f(0)=0求f(4)
解:??由于f(0)=0:
當(dāng)x=1?時(shí)?f(1)=f(0)+1*1=1;
當(dāng)x=2?時(shí)?f(2)=f(1)+2*2=5;
當(dāng)x=3?時(shí)?f(3)=f(2)+3*3=14;
當(dāng)x=4?時(shí)?f(4)=f(3)+4*4=30;
所以, f(4)=30.
上學(xué)的時(shí)候,可能會(huì)這樣做出來(lái)。?
f(x)=f(x-1)+x*x ,其中x>0且f(0)=0就是一個(gè)遞歸函數(shù),它用到了f(x)是用f(x-1)定義的。細(xì)心的人還可以發(fā)現(xiàn)x>0且f(0)=0也是函數(shù)的一部分:
x>0提供一個(gè)遞歸區(qū)間,而f(0)=0提供了一個(gè)初始條件(思維方向不同,在電腦思維中這個(gè)條件為終止條件,詳見(jiàn)下文)。
或許大家覺(jué)得和我們課堂上的遞歸還是有點(diǎn)不同,不同在哪呢??
這就是人腦和電腦的區(qū)別:?
電腦不會(huì)直接去找初始條件去向問(wèn)題遞推。?
而是從問(wèn)題出發(fā),遞推下去,直到找到終止條件(解題時(shí)的初始條件)。
電腦思維:?
f(4)=f(3)+4*4;?
f(3)=f(2)+3*3?
f(2)=f(1)+2*2?
f(1)=f(0)+1*1?
f(0)=0;??????????????????????????????????//終止條件
f(1)=f(0)+1*1=1;?
f(2)=f(1)+2*2=5;?
f(3)=f(2)+3*3=14;?
f(4)=f(3)+4*4=30;?
這個(gè)是電腦的思維過(guò)程,也就是計(jì)算過(guò)程,不會(huì)在前臺(tái)顯示出來(lái)。?
“遇到問(wèn)題,解決問(wèn)題,輸出結(jié)果”——這是電腦處理問(wèn)題的流程。?
關(guān)鍵在于,怎么寫(xiě)個(gè)遞歸函數(shù)讓電腦認(rèn)識(shí)。?
明白遞歸函數(shù)的定義,其實(shí)很簡(jiǎn)單。?
遞歸函數(shù)有三個(gè)充分條件:第一是函數(shù)體,第二是遞歸區(qū)間,第三個(gè)是終止條件,
只要在代碼中全部申明出來(lái),一個(gè)遞歸函數(shù)的就寫(xiě)出來(lái)了。
???????
上面的遞歸函數(shù)的就可以寫(xiě)出下面的代碼:
?
其中用到了if...elseif…語(yǔ)句,這就是來(lái)聲明遞歸函數(shù)的遞歸區(qū)間和終止條件(x>0且f(0)=0)的。
現(xiàn)在在來(lái)寫(xiě)一個(gè)正整數(shù)n的n!的遞歸函數(shù)就思路很明確了。?
分析:正整數(shù)n , f(n)=n!??=>??
函數(shù)體:f(n)=n*f(n-1);??遞歸區(qū)間:n.> 1;????終止條件:n=1;
由此我們可以發(fā)現(xiàn)當(dāng)要寫(xiě)一個(gè)遞歸函數(shù),找到終止條件,一個(gè)遞歸函數(shù)就很明朗了,剩下就是語(yǔ)法問(wèn)題了
?
到linux C這塊,我們做一個(gè)例題:
例:求斐波那契數(shù)列第n項(xiàng)。斐波那契數(shù)列的第一項(xiàng)和第二項(xiàng)是1,后面每一項(xiàng)是前兩項(xiàng)之和,即1,1,2,3,5,8,13,。。。
下面程序采用直接遞歸調(diào)用:
[cpp]?view plaincopy
程序執(zhí)行結(jié)果如下:
遞歸的條件:
上面已經(jīng)簡(jiǎn)單提到,現(xiàn)在再說(shuō)明一下
一個(gè)問(wèn)題能否用遞歸來(lái)實(shí)現(xiàn),看其是否有如下特點(diǎn):
1、須有完成函數(shù)任務(wù)的語(yǔ)句。
例如:下面的代碼定義了一個(gè)遞歸函數(shù)
[cpp]?view plaincopy
該函數(shù)的任務(wù)是在輸出設(shè)備上顯示”ok: 整數(shù)值“。
2、一個(gè)任務(wù)是否能夠避免遞歸調(diào)用的測(cè)試。
例如,上面的代碼中,語(yǔ)句"if (val? > 1)"便是一個(gè)測(cè)試,如果不滿足條件,就不進(jìn)行遞歸調(diào)用。
3、一個(gè)遞歸調(diào)用語(yǔ)句
該遞歸調(diào)用語(yǔ)句的參數(shù)應(yīng)該逐漸逼近不滿足條件,以至最后斷絕遞歸。
例如,上面的代碼匯總,語(yǔ)句 "if( val > 1)"便是一個(gè)遞歸調(diào)用,參數(shù)在漸漸變小,這話總發(fā)展趨勢(shì)能使測(cè)試 "if (val > 1)"最終不滿足。
4,、先測(cè)試,后遞歸調(diào)用
在遞歸函數(shù)定義中,必須先測(cè)試,后遞歸調(diào)用。也就是說(shuō),遞歸調(diào)用是有條件的,滿足了條件,才可以遞歸。
例如,下面的代碼無(wú)限制的調(diào)用函數(shù)自己,造成無(wú)限制遞歸,終將使棧空間溢出;
[cpp]?view plaincopy
下面是完整程序:
?
程序執(zhí)行結(jié)果如下:
[cpp]?view plaincopy
遞歸的應(yīng)用會(huì)繼續(xù)更新,比如在二叉樹(shù)的遍歷
總結(jié)
以上是生活随笔為你收集整理的Linux C学习---递归函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c语言实现开方,c语言开方(c语言开平方
- 下一篇: Linux C 函数练习