問題是這樣的:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一 對兔子, 假如兔子都不死,問每個月的兔子總數爲多少?
這個問題相信大家已經不在陌生了。很多博客裏都有各種不同的解答方法。
最多的方法就是先列出最初幾個月的兔子對數(注意是對數,不是個數)。如下所示:
1,1,2,3,5,8,13,21,34....
然後觀察數據的規律,從而得出這樣一個結論:從第三個月開始,兔子對數等於前面兩個月的兔子對數之和。看到這裏相信你已經有寫出代碼的思路了。這裏也不再詳細說明了。
我要介紹的是,不知道這個規律的前提進行編程。
思路是這樣的:
①、有一個籠子,我們逐一取出籠子中的一對兔子(當然這兩隻兔子的年齡是相同的)。
②、若它們的年齡大於或等於三個月,則生出一對小兔子。
③、將這兩對兔子放入籠中。
④、所有兔子的年齡加1(上面出生的兔子年齡不加)。
⑤、5查看此時籠子中的兔子數量。
可能文字上理解起來會比較困難。相信你一看代碼就明白了。下面是整個代碼:
package com.test; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一 對兔子, 假如兔子都不死,問每個月的兔子總數爲多少?<br/> * @author Administrator */ public class Rabbit { public static void main(String[] args) { List list = new ArrayList(); list.add(new littleRabbit()); for (int k = 1; k <= 20; k++) { for (int j = 0; j < list.size(); j++) { littleRabbit rabbit = (littleRabbit) list.get(j); int age = rabbit.getAge(); if (age >= 3) { list.add(new littleRabbit()); } age++; rabbit.setAge(age); } System.out.println("第" + k + "個月有" + list.size() + "對兔子,一共"+list.size()*2+"只。"); // System.out.print(list.size()+","); } } } class littleRabbit { private int age = 1; public void growUp() { this.age++; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
運行程序會得到下面的結果:
第1個月有1對兔子,一共2只。 第2個月有1對兔子,一共2只。 第3個月有2對兔子,一共4只。 第4個月有3對兔子,一共6只。 第5個月有5對兔子,一共10只。 第6個月有8對兔子,一共16只。 第7個月有13對兔子,一共26只。 第8個月有21對兔子,一共42只。 第9個月有34對兔子,一共68只。 第10個月有55對兔子,一共110只。 第11個月有89對兔子,一共178只。 第12個月有144對兔子,一共288只。 第13個月有233對兔子,一共466只。 第14個月有377對兔子,一共754只。 第15個月有610對兔子,一共1220只。 第16個月有987對兔子,一共1974只。 第17個月有1597對兔子,一共3194只。 第18個月有2584對兔子,一共5168只。 第19個月有4181對兔子,一共8362只。 第20個月有6765對兔子,一共13530只。
我們可以發現,這樣的繁殖速度實在是在驚人了。當繁殖月數爲36月時,程序將會因爲JVM內存不足而終止執行。