C语言递归算法
目錄
遞歸
什么是遞歸?
遞歸的兩個(gè)必要條件?
遞歸的優(yōu)缺點(diǎn)
遞歸求階乘
遞歸求斐波那契數(shù)
優(yōu)化求階乘和斐波那契數(shù)
總結(jié)
遞歸
什么是遞歸?
所謂遞歸,我認(rèn)為就是存在傳遞也存在歸還功能的一種算法,簡(jiǎn)單點(diǎn)來說,就是一個(gè)函數(shù)直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來求解。特點(diǎn):函數(shù)自己調(diào)用自己
遞歸的兩個(gè)必要條件?
- 存在限制條件,當(dāng)滿足這個(gè)限制條件的時(shí)候,遞歸便不再繼續(xù)。?
- 每次遞歸調(diào)用之后越來越接近這個(gè)限制條件
遞歸的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
缺點(diǎn):
下面從幾個(gè)遞歸的例題讓大家更清楚的理解遞歸算法!
遞歸求階乘
- 函數(shù)功能:設(shè)計(jì)factorial函數(shù)求第n階的階乘數(shù)。(不考慮溢出)
- 遞歸部分:階乘的原公式是:n!=n*(n-1)*(n-2)...3*2*1,根據(jù)將大問題分解成小問題,我們把它轉(zhuǎn)換成這樣:n!=n*(n-1)!
- 核心代碼:
當(dāng)n=5時(shí) Factorial函數(shù)遞歸過程配圖如下:
遞歸求斐波那契數(shù)
普及一下,斐波那契數(shù)列(Fibonacci Sequence)又稱黃金分割數(shù)列,因數(shù)學(xué)家萊昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數(shù)列”,指的是這樣一個(gè)數(shù)列:1、1、2、3、5、8、13、21、34、……
- 函數(shù)功能:設(shè)計(jì)Fibonacci函數(shù)求第n個(gè)斐波那契數(shù)的值。(不考慮溢出)
- 遞歸部分:F(n)=F(n-1)+F(n-2)(n>2,n∈N*,F[1]=1,F[2]=1),也就是一個(gè)數(shù)會(huì)等于前兩個(gè)數(shù)相加的結(jié)果。
- 核心代碼:
當(dāng)n=6時(shí),Fibonacci函數(shù)遞歸過程配圖如下:
從以上兩個(gè)例題我們不難看出有些問題:
- Factorial函數(shù)遞歸會(huì)隨著n的增加而使棧的空間變小,以至于棧溢出,程序崩潰。
- Fibonacci函數(shù)遞歸會(huì)存在很多重復(fù)的計(jì)算,使得計(jì)算起來特別耗費(fèi)時(shí)間。
遞歸與棧的關(guān)系
遞歸的過程就是出入棧的過程,在調(diào)試factorial函數(shù)的時(shí)候,如果你給的參數(shù)比較大,那就會(huì)報(bào)錯(cuò):Stack Overflow(棧溢出)這樣的信息。系統(tǒng)分配給程序的棧空間是有限的,但是如果出現(xiàn)了死循環(huán),或者(死遞歸),這樣有可能導(dǎo)致一直開辟棧空間,最終產(chǎn)生棧空間耗盡的情況,這樣的現(xiàn)象我們稱為棧溢出。
那如何優(yōu)化解決上述的問題呢?
優(yōu)化求階乘和斐波那契數(shù)
- 非遞歸的核心代碼:
總結(jié)
看到這里你應(yīng)該對(duì)于遞歸有了很深的理解吧!遞歸的學(xué)習(xí)是一個(gè)漫長的過程,畢竟大師 L. Peter Deutsch 說過:To Iterate is Human, to Recurse, Divine.中文譯為:人理解迭代,神理解遞歸。下篇我將會(huì)帶領(lǐng)大家研究幾個(gè)經(jīng)典的遞歸問題。
如有補(bǔ)充或存在問題請(qǐng)?jiān)谠u(píng)論區(qū)留言喲~
總結(jié)
- 上一篇: c语言万能搜索器,非索引搜索工具(CSe
- 下一篇: 使用appium桌面版在win平台连接逍