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