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

方案二:(变量的交换)
/*
* 假设相邻的两个月份被我定义为变量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);
    }
}

你可能感兴趣的:(java学习笔记之递归)