斐波纳契数列的一个典型示例
- 问题:有一对兔子,从出生后的第三个月起每个月都生一对兔子,小兔子到第三个月后每个月又生一对兔子,假如兔子不死,问22个月后有多少只兔子?
- 解答:
public static void main(String[] args) { //有一对兔子,从出生后的第三个月起每个月都生一对兔子, //小兔子到第三个月后每个月又生一对兔子,假如兔子不死,问22个月后有多少只兔子? //有上面的问题可以看出,其实就是一个斐波纳契数列。 int[] arr = new int[22]; arr[0] = 1; //这个第一个月的兔子对数 arr[1] = 1; //这个第二个月的兔子对数 for (int i = 2; i < arr.length; i++) { arr[i] = arr[i - 1] + arr[i - 2]; // 每个月(每次)出生的数量是上次出生的总数加上上次的出生的总数。 } System.out.println("第22个月出生的兔子有" + arr[21] + "对。"); System.out.println("使用递归求得22个月出生的兔子有" + active(22) + "对"); int sum = 0;//求出总量 for (int i : arr) { sum += i; //System.out.println(i); } System.out.println("兔子实际有" + sum * 2 + "只。");//求出的总的兔子数量 int reduce = Stream.iterate(new int[] { 1, 1 }, x -> new int[] { x[1], x[0] + x[1] }) .limit(22).mapToInt(x -> x[0]).reduce(0, Integer::sum); System.out.println("使用Java8 Stream无限流iterate计算兔子实际有" + reduce * 2 + "只。"); //以下代码不适合并行运行,因为在流的计算中存在有存储状态的供应源,所以不能使用parallel()操作去并行计算。 int reduce2 = IntStream.generate(new IntSupplier() { private int previous = 1; private int current = 1; @Override public int getAsInt() { int oldPrevious = this.previous; int nextValue = this.previous + this.current; this.previous = this.current; this.current = nextValue; return oldPrevious; } })/*.parallel()*/.limit(22).reduce(0, Integer::sum); System.out.println("使用Java8 Stream无限流generate计算兔子实际有" + reduce2 * 2 + "只。"); } /** * 使用递归处理求的 * @return */ private static int active(int monthNum) { if (monthNum == 1 || monthNum == 2) {//出口条件 return 1; } else { return active(monthNum - 1) + active(monthNum - 2); } }