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