Java算法之“兔子问题”

 1 package wulj;
 2 
 3 /**
 4  * Java算法之“兔子问题”:
 5  *         有一只兔子,从出生后第3个月起每个月都生只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
 6  * @Description 
 7  * @author wulj
 8  * @date 2018年6月1日
 9  */
10 public class WljTest {
11     /**
12      * 转化为数学问题如下:
13      * 1.假设第一个月的兔子数为:a,第二个月的兔子数为:b
14      * 2.假设第一个月的新兔子数为 :new,老兔子数为:old    即:a=new + old;,则 第二个月b= new + 2*old;  
15      *   到了第三个月的时候,则第二个月的 new存储的已经是老兔子,新兔子实际是old产生的,所以第三个月的秃子数量为:c= 2*(new + old) + old
16      * 3.化简后发现 a=new + old
17      *             b= new + 2*old
18      *             c= 2*new + 3*old
19      *             即:c= a + b;
20      * 因此转换为代码实现如函数:rabbitProblem()
21      */    
22     public static void rabbitProblem(){
23         int sum_rubbit;//每月的兔子总数
24         int pre_pre_rubbit = 1;//前两个月的兔子数
25         int pre_rubbit = 1;//前一个月的兔子数
26         for (int i = 3; i <= 12; i++) {
27             sum_rubbit = pre_pre_rubbit + pre_rubbit;
28             pre_pre_rubbit = pre_rubbit;
29             pre_rubbit = sum_rubbit;
30             System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit);
31         }
32     }
33     public static int rabbitProblem_digui(int month){
34         int sum=0;
35         if(month == 1 || month == 2){
36             return 1;
37         }else{
38             sum = rabbitProblem_digui(month-1)+rabbitProblem_digui(month-2);
39             return sum;
40         }
41         
42     }
43     
44     
45     /**
46      * 另外一种思路--转化为数学问题如下:
47      * 1.假设第一个月的兔子数为:a,第二个月的兔子数为:b
48      * 2.假设第一个月的新兔子数为 :new,老兔子数为:old    即:a=new + old;,则 第二个月b= new + 2*old;  
49      *   到了第三个月的时候,则第二个月的 new存储的已经是老兔子,新兔子实际是old产生的,所以第三个月的秃子数量为:c= 2*(new + old) + old
50      * 通过上面的规律我们发现:
51      * 当月的new的数量和上个月的old数量是相等的,当月的old的数量是上个月的new与上个月的old的数量之和,当月的总数量是当月的new和当月的old的数量之和
52      * 因此转换为代码实现如函数:rabbitProblem_new()
53      */    
54     public static void rabbitProblem_new(){
55         int sum_rubbit = 0;//每月的兔子总数
56         int new_rubbit = 1;//前两个月的兔子数
57         int old_rubbit = 0;//前一个月的兔子数
58         int temp_new = 0;
59         //第一个月:
60         for (int i = 1; i <= 12; i++) {
61             sum_rubbit = new_rubbit + old_rubbit;
62             temp_new = old_rubbit;
63             old_rubbit = old_rubbit + new_rubbit;
64             new_rubbit = temp_new;
65             System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit);
66         }
67     }
68     
69     /**
70      * 递归方法
71      * @param i
72      * @param new_rubbit
73      * @param old_rubbit
74      */
75     public static void rabbitProblem_new_digui(int i, int new_rubbit,int old_rubbit){
76         int sum_rubbit = 0;//每月的兔子总数
77         int temp_new = 0;
78         sum_rubbit = new_rubbit + old_rubbit;
79         if(i == 12){
80             System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit);
81             return;
82         }else{
83             temp_new = old_rubbit;
84             old_rubbit = old_rubbit + new_rubbit;
85             new_rubbit = temp_new;
86             rabbitProblem_new_digui(i+1,new_rubbit,old_rubbit);
87         }
88         System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit);
89         
90         
91     }
92     public static void main(String[] args) {
93         rabbitProblem_new_digui(1,1,0);
94     }
95 }

 

posted @ 2018-06-01 10:41  caogen1991  阅读(3516)  评论(0编辑  收藏  举报