java 20 -1 递归的概述和案例

  1 /*
  2  * 递归:方法定义中调用方法本身的现象
  3  * 
  4  * 方法的嵌套调用,这不是递归。
  5  * Math.max(Math.max(a,b),c);
  6  * 
  7  * public void show(int n) {
  8  *         if(n <= 0) {
  9  *             System.exit(0);
 10  *         }
 11  *         System.out.println(n);
 12  *         show(--n);
 13  * }
 14  * 
 15  * 注意事项:
 16  *         A:递归一定要有出口,否则就是死递归
 17  *         B:递归的次数不能太多,否则就内存溢出
 18  *         C:构造方法不能递归使用
 19  *     
 20  *      public DiGuiDemo() {
 21  *         DiGuiDemo();
 22  *     }
 23  * 
 24  * 举例:
 25  *         A:从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
 26  *             从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
 27  *                 从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
 28  *                     从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
 29  *                         ...
 30  *                 出口:    庙挂了,或者山崩了
 31  *         B:学编程  -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费
 32  *              学编程  -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费
 33  *                 学编程  -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费
 34  *                     学编程  -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费
 35  *                         ...
 36  *                 出口:娶不到媳妇或者生不了娃娃    
 37  */
 38  
 39  
 40  package zl_DiGui;
 41 /*
 42      有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
 43      分析:
 44                 兔子对数
 45       第一个月:     1
 46       第二个月:    1
 47       第三个月:    2
 48       第四个月:    3    
 49       第五个月:    5
 50       第六个月:    8
 51       1,1,2,3,5,8...
 52      规则:
 53          A:从第三项开始,每一项都是前两项之和
 54          B:第一第二项都是已知的
 55     方法:
 56         A:数组
 57         B:变量的变化实现
 58                 第一个月  a=1,b=1;
 59                 第二个月  a=1,b=2;
 60                 第三个月  a=2,b=3;
 61                 第四个月  a=3,b=5;
 62                 ...
 63                 每个月的a,是上个月的b,每个月的b,是上个月的a+b
 64         C:递归
 65             a:返回类型 int
 66             b:参数列表 int n (月份)
 67             c:出口:n = 1 || n ==2 时,就是第一个月或第二个月时
 68             
 69  */
 70 public class DiGuiDemo1 {
 71 
 72     public static void main(String[] args) {
 73         
 74         //第一种方法:数组
 75         int[] ary = new int[20];
 76         ary[0] = 1;
 77         ary[1] = 1;
 78         
 79         for(int x = 2; x < ary.length ; x ++){
 80             ary[x] = ary[x - 1] + ary [x - 2];
 81         }
 82         System.out.println(ary[19]);
 83         
 84         //第二种方法:变量的变化实现
 85         int a = 1;
 86         int b = 1;
 87         for(int y = 3 ; y <= 20 ; y ++){
 88             int temp =  a;
 89             a = b;
 90             b = temp + a ;
 91         }
 92         System.out.println(b);
 93         
 94         //调用递归
 95         System.out.println(digui(20));
 96     }
 97         //递归
 98     public static int digui(int n ) {
 99         if(n == 1 || n == 2){
100             return 1;
101         }else{
102             return digui(n-1) + digui(n-2);
103         }
104     }
105 }

 

 递归解决问题的思想及图解

 

递归求阶乘的代码实现及内存图解

 

posted @ 2016-09-28 20:36  卡拉瓦  阅读(880)  评论(0编辑  收藏  举报