1. 程式人生 > >用面向物件的思想解決不死神兔問題(斐波那契數列)

用面向物件的思想解決不死神兔問題(斐波那契數列)

/**
 *    有一對兔子,從出生後第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);
        }
    }
}