演算法題練習系列之(三十六): 養兔子
阿新 • • 發佈:2019-02-03
-----------------------------------------------------------------------------------------------------------
時間限制: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); } } }