美文网首页Java学习笔记
java学习笔记之递归

java学习笔记之递归

作者: 红姑娘 | 来源:发表于2016-11-15 10:03 被阅读10次

    问题一:求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);
        }
    }

    相关文章

      网友评论

        本文标题:java学习笔记之递归

        本文链接:https://www.haomeiwen.com/subject/efvkpttx.html