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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM