數據結構之遞歸


定義:一個函數直接或間接調用自己

 

遞歸需要滿足的三個條件:

  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 ...

 

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM