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 }