定義:一個函數直接或間接調用自己
遞歸需要滿足的三個條件:
1.遞歸必須有一個明確的中止條件
2.該函數所處理的數據規模必須在遞減
3.這個轉化必須是可解的
循環和遞歸:
遞歸:
易於理解
速度慢,存儲空間大
循環:
不易理解
速度快,存儲空間小
舉例:
1.求階乘
這一個所知道的信息就是 n! = n * (n-1)!;
這個時候,我們可以讓程序不停的調用這個方法以便達到這種所謂的結果。
1 #include <stdio.h> 2 long sum(long n); 3 long sum(long n){ 4 long kk = 1; 5 if(n ==1){ 6 return kk; 7 }else{ 8 kk = n * sum(n-1); 9 return kk; 10 } 11 } 12 int main(void){ 13 printf("fff %l\n",sum(32)); 14 return 0; 15 16 }
//在程序中需要注意的是:C語言里面沒有比較明確的規定long和int的字節數,所以如果大於字節范圍就會出現變成零的可能性.
2.1+2+3+..+100 的和
PS:這里就不再貼代碼與上面概念一致
函數的調用:
當在一個函數的運行期間調用另一個函數時,在運行被調函數之前,系統需要完成三件事:
1).將所有的實際參數,返回地址等信息傳遞給被調函數保存。
2).為被調函數的局部變量(也包括形參)分配存儲空間
3).將控制轉移到被調函數的入口
從被調函數返回主調函數之前,系統也要完成三件事:
1).保存被調函數的報錯結果
2).釋放被調函數所占的存儲空間
3).依照被調函數保存的返回地址將控制轉義到調用函數。
3.漢諾塔
漢諾塔最主要的就是三個步驟:
1)將n-1個盤子從A經C移到B
2)將n從A直接移到C
3)將n-1個盤子從B經A移到C
1 #include <stdio.h> 2 3 void hannuota(int n,char A,char B,char C){ 4 5 if(1 == n){ 6 printf("將編號為%d的盤子從%c移到%c\n",n,A,C); 7 }else{ 8 9 hannuota(n-1,A,C,B); 10 printf("將編號為%d的盤子從%c移到%c\n",n,A,C); 11 hannuota(n-1,B,A,C); 12 } 13 return; 14 } 15 16 17 int main(void){ 18 19 int n; 20 char ch1 = 'A'; 21 char ch2 = 'B'; 22 char ch3 = 'C'; 23 printf("請輸入A柱子上面原始有的盤子個數!"); 24 scanf("%d",&n); 25 printf("\n"); 26 hannuota(n,ch1,ch2,ch3); 27 28 return 0; 29 }
4.走迷宮
遞歸的應用
1.樹和森林就是以遞歸的方式定義的
2.數和圖的很多算法就是遞歸實現的
3.很多數學公式就是以遞歸的方式定義的
例如:斐波拉基序列:1 1 2 3 5 ...