java學習筆記之遞歸

問題一:求n的階乘:n! = n(n-1)!;
n! = n
(n-1)(n-2)....32*1;

方案一:便利

    public static void main(String[] args) {                    
      // System.out.println(1 * 2 * 3 * 4 * 5);
      int jc = 1;
      for (int x = 1; x <= 5; x++) {
          jc *= x;
      }
      System.out.println(jc);
     }

方案二:遞歸

public static void main(String[] args) {
    System.out.println(jc(5));
}

/*
 * 遞歸要寫一個方法出來。
 * 我假設我有一個方法jc(n)表示n的階乘。
 * 請問,你如何表示n-1的階乘。jc(n-1)。
 * 規律:n! = n*(n-1)!
 * 出口條件是什么:n=1的時候,結果是1。
 */
public static int jc(int n){
    if(n==1){
        return 1;
    }else {
        return n*jc(n-1);
    }
}

問題二:
* 有一對兔子,從出生后第3個月起每個月都生一對兔子,
* 小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,
* 問第20個月的兔子對數為多少?

方案一(數組):

   /*
 * 從第三個月開始,每個月是前兩個月之和。第一月和第二月是已知道的,并且都是1。
 * 斐波那契數列。
 * 
 *          兔子對數
 * 第一月          1
 * 第二月          1
 * 第三月          2
 * 第四月          3
 * 第五月          5
 * 第六月          8
 * ...
 * 
*/

        public static void main(String[] args) {
                // 數組
            int[] arr = new int[20];
            arr[0] = 1;
            arr[1] = 1;
           /*
           arr[2] = arr[0] + arr[1];
           arr[3] = arr[1] + arr[2];
           arr[4] = arr[2] + arr[3];
            ...
          */
          for(int x=2; x<arr.length; x++){
              arr[x] = arr[x-2] + arr[x-1];
          }
    
         System.out.println(arr[19]);
    
         //變量的交換
         int a = 1;
         int b = 1;
         for(int x=0; x<18; x++){
               int temp = a;
                a = b;
                b = temp + b;
           }
            System.out.println(b);
      }

方案二:(變量的交換)
/*
* 假設相鄰的兩個月份被我定義為變量a,b
* 第一個相鄰:a=1,b=1
* 第二個相鄰:a=1,b=2
* 第三個相鄰:a=2,b=3
* 第四個相鄰:a=3,b=5
* 第五個相鄰:a=5,b=8
*/
public static void main(String[] args) {
//變量的交換
int a = 1;
int b = 1;
for(int x=0; x<18; x++){
int temp = a;
a = b;
b = temp + b;
}
System.out.println(b);
}

方案三:(遞歸)

/*
 * 1,1,2,3,5,8...
 * 
 * 規律:從第三項開始,每一項是前兩項之和。 出口:第一項和第二項是已知的。
 * 
 * 假設我有一個方法:f(n)表示第n項。 請問n-1項和n-2項怎么表示呢? f(n-1),f(n-2)
 */
public static void main(String[] args) {
    System.out.println(f(20));
}

public static int f(int n) {
    if (n == 1 || n == 2) {
        return 1;
    } else {
        return f(n - 1) + f(n - 2);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容