用面向物件的思想解決不死神兔問題(斐波那契數列)
阿新 • • 發佈:2019-01-07
/**
* 有一對兔子,從出生後第3個月起每個月都生一對兔子,
* 小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
*
* 規律分析: 1,1,2,3,5,8,13,21,34...
*/
說起這個問題,可能第一反應大多都是遞迴解決.其實,這個問題同樣也可以用面向物件的思想來解決.好啦話不多說上程式碼.
首先,把兔子作為一個實體類封裝起來,它具有年齡屬性以及成長,繁殖的行為.
/** * 兔子 */ public class Rabbit { /** * 年齡 */ private int age; /** * 成長 */ public void grow() { ++age; } /** * 繁殖 */ public Rabbit breed() { //每隻兔子最少兩歲才具有繁殖能力 if (age >= 2) { return new Rabbit(); } return null; } }
具體實現:
public class Test { public static void main(String[] args) { int month = 12; int count = oop(month); System.out.println("第" + month + "個月的兔子總數是" + count + "只"); } private static int oop(int month) { List<Rabbit> family = new ArrayList<>(); //兔子家族 family.add(new Rabbit()); //第一位家族成員誕生,它是兔子鼻祖 for (int i = 1; i < month; i++){ //每迴圈一次,代表過一個月 for (Rabbit r : new ArrayList<Rabbit>(family)) { //所有家族成員年齡增加,並開始繁殖 r.grow(); Rabbit baby = r.breed(); if (baby != null) { family.add(baby); //新的baby也會加入家族中 } } } return family.size(); //最終,返回家族中的成員數量 } }
執行結果:
第12個月的兔子總數是144只
怎麼樣,通過這個小小demo有沒有讓你感受到OOP思想的強大之處呢?
也順便附上遞迴程式碼:
public class Test { public static void main(String[] args) { int month = 12; int count = recursion(month); System.out.println("第" + month + "個月的兔子總數是" + count + "只"); } private static int recursion(int month) { if (month == 1 || month == 2) { return 1; } else { return recursion(month - 1) + recursion(month - 2); } } }