問題:
一頭母羊的壽命是5年,它會在第2年底和第4年底各生下一頭母羊,第5年底死去,問一開始農場有1頭母羊,N年後,農場會有多少只母羊?
解析1)
這道題不用刻意的去注意它的邏輯,也不用傷腦筋的去挖掘它暗藏著什麼公式,只要按人的正常生活和自然規律理解一下就行了。
首先虛擬一隻母羊,這隻母羊只有一個屬性,就是年齡:
class Sheep {
public int age = 0; // 預設一隻新羊的年齡為0
}
然後這個人有一個計數器,來計算N年後牧場羊的個數。這個計數器的工作原理是:以年為單位開始計算,每經過一年,迴圈牧場所有的羊:
(1)使羊的年齡加1,
(2)如果母羊今天2歲了或是4歲了,就讓它生一隻小羊,
(3)如果母羊今年5歲了,就讓他過世,並清理牧場
// n為過的年數
public static int getSheeps(int n) {
// sheeps表示整個羊的生態圈
ArrayList<Sheep> sheeps = new ArrayList<Sheep>();
sheeps.add(new Sheep());
List<Sheep> addSheeps = new ArrayList<Sheep>();//待添加到生態圈的新羊
List<Sheep> delSheeps = new ArrayList<Sheep>();//待從生態圈刪除的羊
for (int i = 1; i <= n; i++) {
for (Sheep s : sheeps) {
s.age++;
if (s.age==2||s.age==4) {// 羊仍存活
addSheeps.add(new Sheep());
} else if(s.age==5){ // 羊死亡,加入刪除列表delSheeps中,等待刪除
delSheeps.add(s);
}
}
sheeps.addAll(addSheeps);
sheeps.removeAll(delSheeps);
addSheeps.clear();//清空addSheeps
delSheeps.clear();//清空待刪除列表中的元素
}
return sheeps.size(); // 最後總羊數即羊生態圈中的羊數目
}
解析2)
凡是碰到“一生二、二生三、三生萬物”的問題,無疑用遞迴演算法(順便和斐波那契數列聯絡起來)。下面是一個完整的代碼:
public class MyMain{
public static int get(int year)
{
int num=1; //The initial sheep number
for(int i=1; i<=year; i++){
if(i==2){
num+=get(year-2);
}else if(i==4){
num+=get(year-4);
}else if(i==5){
num--;
}
}
return num;
}
public static void main(String[] args) {
String line1="";
String line2="";
for(int i=1;i<=18;i++){
line1+="第"+i+"年"+" ";
line2+=get(i)+" ";
}
System.out.println(line1);
System.out.println(line2);
}
}