递归初识
一、什么是遞歸
所謂遞歸,簡單點來說,就是一個函數直接或間接調用自身的一種方法,每調用一次就進入新的一層。它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解。遞歸函數必須有結束條件。當函數在一直遞推,直到遇到結束條件后返回,所以遞歸要有兩個要素,結束條件與遞推關系
二、遞歸的簡單應用
?第一個人的年齡為十歲,第二個人的年齡比第一個人年齡大兩歲,以此類推,求第五個人的年齡;
#include <stdio.h> int Age(int n) {if(n==1)//第一個人的年齡{return 10;}else{return Age(n-1)+2;//遞歸過程,自己調用自己,終止條件n=1} } int main() {printf("%d\n",Age(5));return 0; }三、遞歸與棧的關系
遞歸在棧上開辟空間,棧的空間大約1M左右。
常常聽到 “遞歸的過程就是出入棧的過程”,這句話怎么理解?我們以上述代碼為例,取?n=5,則過程如下:
- 當n=5時,Age(5)調用了Age(4),Age(4)又接著調用Age(3),Age(3)又接著調用Age(2),Age(2)又接著調用Age(1),直到遇到Age(1)結束,這個過程都是入棧;
- 因 1 是遞歸結束條件,故不再入棧,此時棧高度為5,也就是所謂的遞歸深度;
- Age(1)做完,出棧,而Age(1)做完意味著Age(2)也做完,同樣進行出棧,重復下去,直到所有的都出棧完畢,遞歸結束。
如下圖:
四、遞歸總結
1、當函數自己調用自己時,系統將自動把函數中當前的變量和形參暫時保留起來,在新一輪的調用過程中,系統為新調用的函數所用到的變量和形參開辟另外的存 儲單元(內存空間)。每次調用函數所使用的變量在不同的內存空間。
2、遞歸調用的層次越多,同名變量的占用的存儲單元也就越多。一定要記住,每次函數的調用,系統都會為該函數的變量開辟新的內存空間。
3、當本次調用的函數運行結束時,系統將釋放本次調用時所占用的內存空間。程序的流程返回到上一層的調用點,同時取得當初進入該層時,函數中的變量和形參 所占用的內存空間的數據。
4、所有遞歸問題都可以用非遞歸的方法來解決,但對于一些比較復雜的遞歸問題用非遞歸的方法往往使程序變得十分復雜難以讀懂,而函數的遞歸調用在解決這類 問題時能使程序簡潔明了有較好的可讀性;但由于遞歸調用過程中,系統要為每一層調用中的變量開辟內存空間、要記住每一層調用后的返回點、要增加許多額外的 開銷,因此函數的遞歸調用通常會降低程序的運行效率。
遞歸的優點:代碼簡潔,可讀性高。
遞歸的缺點:一般情況下空間復雜度較高,運行效率降低。
?
?
?
?
?
總結
- 上一篇: Windows XP自动关机的实现
- 下一篇: iptables限制同一IP连接数