递归(1)
什么是遞歸?
一個函數(方法)調用其本身,這種調用過程被稱作遞歸
???? 1、當一個函數(方法)調用自己時,如果編程中沒有設定可以終止遞歸的條件檢測,它會無限制地進行遞歸調用,所以需要謹慎處理。
???? 2、遞歸一般可以代替循環語句使用。有些情況下使用循環語句比較好,而有些時候使用遞歸更有效。遞歸方法雖然使程序結構更優美,但其執行效率卻沒有循環語句高。
1,求1+2+3+...+...n
int sumX(unsigned int x) {if (x == 1){return x;}else{return sumX(x-1) + x; } }?
2,二分查找用遞歸實現
void binseach(int a[],int high,int low,int key) {if (key > a[high]||key < a[low]){printf("Not Found %d in a[]\n",key);return;}int mid;mid = (high+low)/2;if (a[mid] == key){printf("a[%d] = %d\n",mid,key);}else{if (a[mid] > key){binseach(a,mid-1,low,key);}else{binseach(a,high,mid+1,key);}} }?注:每一次的遞歸調用都需要壓棧占用內存,效率不高。
?
?遞歸的原理:
?????? 1、每一級的函數調用都有臫的變量。也就是說:第1級調用中的n不同于第2級調用中的n,因此程序創建了4個獨立的變量,雖然每個變量的名字都是但是它們分別具有不同的值。
?????? 2、第一次函數調用都會有一次返回。當程序流執行到某一級遞歸的結尾處時,它會轉移到前1級遞歸繼續執行。程序不能直接返回到main()函數中的初始調用部分,而是通過遞歸的每一級逐一返回,即從遞歸的某一級返回到調用它的那一級。
?????? 3、遞歸函數中,位于遞歸調用前的語句和各級被調用函數具有相同的執行順序。例如在程序中,輸出語句site1位于遞歸調用語句之前,它按照遞歸調用的順序被執行了4次,即依次為:第1級,第2級,第3級,第4級。
?????? 4、遞歸函數中,位于遞歸調用后的語句的執行順序和各個被調函數的順序相反。例如,輸出語句site2 位于遞歸語句后,其執行順序是:第4級,第3級,第2級,第1級.遞歸的這種特性在解決涉及反向順序的編程問題時很有用。
?????? 5、雖然每一級遞歸都有自己的變量,但是函數代碼并不會得到復制。函數代碼是一毓的計算機指令,而函數調用就是從頭執行這個指令集的一條命令。一個遞歸調用會使程序從頭執行相應函數的指令集,除了為每次調用創建變量,遞歸調用非常類似于一個循環語句。實際上,遞歸有時可被用來代替循環,反之亦然。
?????? 6、最后、遞歸函數中必須包含可以終止遞歸調用的語句。通常情況下,遞歸函數會使用一個if條件語句或其它類似的語句以便當函數參數達到某個特定值時結束遞歸調用。
?
?
?
參考:http://www.cnblogs.com/yangpu/archive/2009/06/06/1497482.html
轉載于:https://www.cnblogs.com/dingsd/p/3271640.html
總結
- 上一篇: CAD输出的局部平面坐标数据配准转换到W
- 下一篇: RequireJS模块化之循环依赖