1. 程式人生 > >演算法題練習系列之(三十六): 養兔子

演算法題練習系列之(三十六): 養兔子

-----------------------------------------------------------------------------------------------------------

時間限制:1秒  空間限制:32768K  程式碼長度限制 100 KB

-----------------------------------------------------------------------------------------------------------
題目描述:
一隻成熟的兔子每天能產下一胎兔子。每隻小兔子的成熟期是一天。 某人領養了一隻小兔子,請問第N天以後,他將會得到多少隻兔子。
輸入描述:
測試資料包括多組,每組一行,為整數n(1≤n≤90)。
輸出描述:
對應輸出第n天有幾隻兔子(假設沒有兔子死亡現象)。
輸入例子:
1 
2
輸出例子:
1
2

-----------------------------------------------------------------------------------------------------------

實現思路:

(1).這題需要用遞迴思想處理;

 * 總數        大兔子        小兔子          天數  * 1           0             1               0(起始狀態)  * 1           1             0               1  * 2           1             1               2  * 3           2             1               3  * 5           3             2               4  * 8           5             3               5  * 13          8             5               6 (2).通過資料可以觀察出,第N天的兔子數量的等於第N-1天和第N-2天的數量之和,就是典型的費波那契數列特點; (3).那為什麼數量滿足這個規律呢,每天的兔子數量等於當天大兔子和小兔子數量之和,而當天的大兔子數量就是昨天的兔子總數量,因為昨天不管大兔子還是小兔子,都會變成大兔子;當天的小兔子數量是昨天的大兔子產下的(昨天的小兔子還不具有生產能力),而昨天的大兔子數量是前天的兔子總數量,邏輯上面一樣; (4).需要注意的是,該題不能直接遞迴呼叫求結果,會超時,有兩個方法處理,第一種是,先把結果算出來用陣列儲存,然後根據對應的N值,直接獲取對應的兔子數;一種是用map記錄哪些N是計算過的,直接儲存下來,不反覆去計算。 (5).還有一點需要注意,用long儲存結果,不然可能會溢位。

-----------------------------------------------------------------------------------------------------------

package com.biyao.algorithm.niuke.a2;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main_a2_003 {
	
       public static Map<Integer,Long> map = new HashMap<Integer,Long>();
    public static void main(String[] args) {
        System.out.println(getRabbitNum(100000));
        Scanner scan = new Scanner(System.in);
        while(scan.hasNextInt()){
            int n = scan.nextInt();
            System.out.println(getRabbitNum(n));
        }
    
    }
    
    public static long getRabbitNum(int n){
        if(n == 1){
            return 1;
        }else if(n == 2){
            return 2;
        }else{
            if(map.containsKey(n)){
                return map.get(n);
            }else{
                map.put(n, getRabbitNum(n-1) + getRabbitNum(n-2));
            }
            return map.get(n);
        }
    }
}