烧脑:求解 类似 斐波那契数列 的 奥数题

1、斐波那契数列 Fibonacci sequence

1)数列

1、1、2、3、5、8、13、21、34、...

2)递归公式

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

2、兔子 只繁殖,不死亡

1)题目

  • 有一对兔子,从出生后,
    • 第 1、2 月为 幼年期
    • 第 3 月开始,进入了 成年期,每个月都生一对 兔子
  • 小兔子 长到 第三个月后,每个月又生一对兔子

假如兔子都不死,问 第n月 的兔子总数 为多少?

2)求解

  • 本月的兔子数量 = 上月的兔子数量 + "跨月" 时,产仔的数量
    • 补充:凡是在 上上月 就已经 存在的兔子,在本月,必然有 产仔能力了。所以在 "跨月" 的过程中,这些兔子 都会 "产仔"
    • 即:"跨月" 时,产仔的数量 = 上上月 兔子的 总个数
  • 本月的兔子数量 = 上月的兔子数量 + 上上月的兔子数量

递归公式,也即:斐波那契数列

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

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

 


3、兔子 即繁殖、又死亡

1)题目

  • 有一对兔子,从出生后,
    • 第 1、2 月为 幼年期
    • 第 3 月开始,进入了 成年期,每个月都生一对 兔子
  • 小兔子 长到 第3月 后,每个月又生一对兔子
  • 当 一对兔子 在 第5月 时,他们产完仔之后,就会死亡

问 第n月 的兔子总数 为多少?

2)求解

使用 "递归" 实在太绕,改用 队列实现了,资源占用 反而会比较少一些

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、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));
    }

}

转载于:https://my.oschina.net/u/2602893/blog/3023697

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值