package javaBlog;/*古典問題:3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少。分析:首先我們要明白題目的意思指的是每個月的兔子總對數;假設將兔子分為小中大三種,兔子從出生後三個月後每個月就會生出一對兔子,那麼我們假定第一個月的兔子為小兔子,第二個月為中兔子,第三個月之後就為大兔子,那麼第一個月分別有1、0、0,第二個月分別為0、1、0,第三個月分別為1、0、1,第四個月分別為,1、1、1,第五個月分別為2、1、2,第六個月分別為3、2、3,第七個月分別為5、3、5……兔子總數分別為:1、1、2、3、5、8、13…… 於是得出了一個規律,從第三個月起,後面的兔子總數都等於前面兩個月的兔子總數之和,即為斐波那契數列。*/public class RabbitNumber { private long rabbits = 1; private long lastSecondRabbits ,lastRabbits; /** * 遍曆從第一個月到第n個月的兔子總數 * */ public void forEachMothsToRabbits(int moths){ System.out.println(System.currentTimeMillis()); for (int i = 1;i<= moths;i++) System.out.println("第"+i+"個月兔子數為"+getRabbits(i)); System.out.println(System.currentTimeMillis()); } /** * 擷取當前月的兔子總數 * */ private long getRabbits(int moths){ if (moths == 1 || moths==2 ) return rabbits=1; else if (moths == 3) return rabbits = 2; else{ //初始化上一個月以及上兩個月兔子數量 if (lastRabbits == 0 && lastSecondRabbits ==0 ){ lastSecondRabbits = getRabbits(moths-2); lastRabbits = getRabbits(moths-1); } //計算這一個返回的兔子數量 rabbits= lastRabbits+lastSecondRabbits; /*讓兩個月的兔子數等於上一個月兔子數,讓上個月等於這個月兔子數 為了下一次計算(下月兔子數)更加高效快捷避免過冗餘遞迴影響計算速率*/ lastSecondRabbits = lastRabbits; lastRabbits = rabbits; return rabbits ; } }}