遞迴函式(Recursive)
更新日期:2020.08.03
 
參考資料:
 
  • 遞迴函數
    簡單來說,函數以直接或間接的方式,定義(呼叫)自己,稱為遞迴函數。

    說明:f(x) = f(x-1) + 1
    上述函數,會有什麼問題呢?
    x=3, f(3)=f(2)+1
    x=2, f(2)=f(1)+1
    x=1, f(1)=f(0)+1
    ...
    (無窮...? 如何終止)


  • 遞迴 vs 迴圈
    之前在迴圈時,介紹的求和公式,如果大家還有印象,
    讓我們對照一下迴圈(重複結構),跟遞迴方式的差異:
    i sum=sum+i 迴圈結果 遞迴作法 備註
    1 sum=0+1 1  S(1)=1  
    2 sum=1+2 1+2  S(2)= S(1)+2  
    3 sum=(1+2)+3 1+2+3  S(3)= S(2)+3  
       ...  ...  ...  
    k sum=sum+k 1+2+3+...+k  S(k) = S(k-1)+k  
    可以發現以迴圈來執行,是利用其重複執行的特性,將迴圈變數加總起來,
    但以遞迴的方式,則是(不斷)呼叫自己,將傳遞的參數逐漸遞減,達到加總。

    所以,各位可以將此求和的遞迴函數程式碼完成嗎?
    int sum(int n)
    {
        if(結束條件成立){
           return 預設值;
        }
        return sum(n-1)+n;
    }
    可以的話,在main()中呼叫此函數看看是否ok...
    #include <stdio.h>
    int sum(int n)
    {
       ...
    }

    main()
    {    int n;
         printf("Input n:");
         scanf("%d", &n);
         printf("1+2+3+4...+n=%d\n", sum(n) );
    }


    [練習]:
    請用遞迴函數的方式,寫一個程式,
    輸入n,
    輸出 1x2 + 2x3 + 3x4 +...+ (n-1)xn 的結果.





  • 遞迴函數定義:
    自己呼叫自己的函式。需要符合下列事項:

    注意:
    1. 尋找遞迴的規律,觀察歸納出符合的關係式。
    2. 在某些條件狀況下,遞迴要能結束;簡單說就是要有終止條件。

    讓我們來看費氏數列,費氏數列的關係,該項數值是由前兩個數項加起來,
    而費氏數列的終點,是f(0)=0,f(1)=1,
    讓我們練習一下下面的範例。

  • 範例:

    請編譯執行上述程式,測試以下輸入,
    n=3,
    n=5,
    n=30,
    n=40,
    看看結果為何?
    (改善方法)



  • 練習:
    求ab ?
    輸入a, b
    輸出 a 的b次方(利用遞迴)


  • 常見應用題:
    1. 求和Summation
    2. 階層Factorial(n!)
    3. 最大公因數(GCD, Greatest Common Divisor)
    4. 二項係數(Binomial Coefficient): C(m,n)
    5. 費氏數列 Fibonacci Number
    6. 河內塔(Hoari)


曾老師製作