遞迴


1 遞迴的構成

  • 關係式
  • 終止條件

遞迴的運作就在於,一個函式不斷地呼叫自己,直到達成終止條件才結束

終止條件就像是遞迴的心臟,一定要有終止條件才可以避免無窮呼叫的窘況

function Recur_fun(){
    if ( 終止條件 )
       return ...
    else
       return 呼叫自己
}

2 遞迴基本題 計算

2-1 計算1+4+9+....+n*n=?
//PURPOSE:用遞迴計算1+2+...+N=?
public static  void  main(String[] args) {

    Scanner s=new Scanner(System.in);
    int n=s.nextInt();
    System.out.println("1+4+...+"+(n*n)+"="+sum(n));

}
public static int sum(int n){ //static函數main一定要使用同為static的function
    if(n==1){//終止條件
        return 1;
    }else{
        return n*n+sum(n-1);
    }

}
------------------------------
4
1+4+...+16=30

sum(4)=4*4+sum(3) =16+14=30

sum(3)=3*3+sum(2) =9+5=14

sum(2)=2*2+sum(1) =5

sum(1)=1

2-2 計算n!=?

前面有試過用for迴圈來進行 n! 的計算,現在來試試看如何用遞迴撰寫來達到相同目的,寫完後記得與for迴圈寫法相比較

//PURPOSE:計算5!
public static void main(String[] args) {
    System.out.println(factorial(5));
}
public static int factorial(int n){
    if(n==1){
        return 1;
    }
    else{
        return n*factorial(n-1);
    }
}
--------------------
120

factorial(5)=5*factorial(4)

factorial(4)=4*factorial(3)

factorial(3)=3*factorial(2)

factorial(2)=2*factorial(1)

factorial(1)=1

2-3 求費式數列第n項的數為何
//PURPOSE:求費式數列第N項數為何
public static  void  main(String[] args) {

    Scanner s=new Scanner(System.in);
    int n=s.nextInt();
    System.out.println("費式數列的第"+n+"項="+fibonacci(n));

}
public static int fibonacci(int n){ //static函數main一定要使用同為static的function
    if(n<=2){//前兩項皆=1
        return 1;
    }else{//後面幾項=前一項+前二項
        return fibonacci(n-1)+fibonacci(n-2);
    }
}
-----------------
5
費式數列的第5項=5

fibonacci(5)=fibonacci(4)+fibonacci(3)

fibonacci(4)=fibonacci(3)+fibonacci(2)

fibonacci(3)=fibonacci(2)+fibonacci(1)

fibonacci(2)=1

fibonacci(1)=1

2-4 計算最大公因數與最小公倍數
//PURPOSE:找出兩數字的最大公因數與最小公倍數
public static void main(String[] args) {

    System.out.println("25及10的最大公因數="+GCD(25,10));
    System.out.println("25及10的最小公倍數="+LCM(25,10,GCD(25,10)));

}
public static int GCD(int x,int y){
 //輾轉相除法
    if(x%y==0){
        return y;
    }
    else{
        return GCD(y,x%y);
    }
}
public static int LCM(int x,int y,int gcd){ //最小公倍數=兩數相乘/最大公因數
    return x*y/gcd;
}
-----------------------------------------------
25及10的最大公因數=5
25及10的最小公倍數=50
進階題:用for或while迴圈找出最大公因數與最小公倍數

3 非遞迴 vs 遞迴

非遞迴 遞迴
記憶題資源 普通 stack耗記憶體資源多
程式碼 較遞迴複雜 簡潔好閱讀
執行速度 較快 較慢

results matching ""

    No results matching ""