燒腦:求解 相似 斐波那契數列 的 奧數題

一、斐波那契數列 Fibonacci sequence

1)數列this

一、一、二、三、五、八、1三、2一、3四、...spa

2)遞歸公式3d

  • f(1) = 1
  • f(2) = 1
  • f(n) = f(n-1) + f(n-2)

二、兔子 只繁殖,不死亡

1)題目blog

  • 有一對兔子,從出生後,
    • 第 一、2 月爲 幼年期
    • 第 3 月開始,進入了 成年期,每一個月都生一對 兔子
  • 小兔子 長到 第三個月後,每一個月又生一對兔子

假如兔子都不死,問 第n月 的兔子總數 爲多少?遞歸

2)求解隊列

  • 本月的兔子數量 = 上月的兔子數量 + "跨月" 時,產仔的數量
    • 補充:凡是在 上上月 就已經 存在的兔子,在本月,必然有 產仔能力了。因此在 "跨月" 的過程當中,這些兔子 都會 "產仔"
    • 即:"跨月" 時,產仔的數量 = 上上月 兔子的 總個數
  • 本月的兔子數量 = 上月的兔子數量 + 上上月的兔子數量

遞歸公式,也即:斐波那契數列ci

f(n) = f(n-1) + f(n-2)

f(1) = 1
f(2) = 1

 


三、兔子 即繁殖、又死亡

1)題目資源

  • 有一對兔子,從出生後,
    • 第 一、2 月爲 幼年期
    • 第 3 月開始,進入了 成年期,每一個月都生一對 兔子
  • 小兔子 長到 第3月 後,每一個月又生一對兔子
  • 當 一對兔子 在 第5月 時,他們產完仔以後,就會死亡

問 第n月 的兔子總數 爲多少?rem

2)求解it

使用 "遞歸" 實在太繞,改用 隊列實現了,資源佔用 反而會比較少一些

public class RabbitPopulation {

    private class Rabbit {

        int age = 1; // 新生的兔子,默認爲 1 歲

        void growUp() {
            this.age++;
        }

    }

    public int count(int month) {

        Queue<Rabbit> population = new ArrayDeque<Rabbit>();

        // 初始化 第1月
        population.add(new Rabbit());
        int monthCount = 1;

        while(monthCount < month) { // 月的 循環

            int count = population.size();

            while(count > 0) { // 某一個月中,兔子的循環
                Rabbit rabbit = population.remove();

                switch (rabbit.age) {

                    // 1=>2 歲的兔子,只成長,不產仔
                    case 1:
                        rabbit.growUp();
                        population.add(rabbit);
                        break;

                    // 2=>三、3=>4 歲的兔子,成長,併產仔
                    case 2:
                    case 3:
                        rabbit.growUp();
                        population.add(rabbit);

                        population.add(new Rabbit());
                        break;

                    // 4=>5 歲的兔子,在 產完仔後,會死亡
                    default:
                        population.add(new Rabbit());
                }
                count--;
            }
            monthCount++;
        }

        return population.size();
    }

    public static void main(String[] args) {
        RabbitPopulation s = new RabbitPopulation();

        System.out.println("總數量:" + s.count(15));
    }

}
相關文章
相關標籤/搜索