不死神兔

不死神兔的一点理解

  • 题目是这样的:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个 月又生一只兔子,假如兔子都不死,问第二十个月的兔子对数为多少。

看到这个问题,我首先想到的是递归,因为他符合斐波那契数列,代码如下:

public class Rabbit {
    public int rabbit(int month){
        if(month == 2 || month == 1){
            return 1;
        }else{
            return rabbit(month - 1) + rabbit(month - 2);//3
        }
    }
    public static void main(String[] args) {
        Rabbit r = new Rabbit();
        int rabbit = r.rabbit(20);
        System.out.println(rabbit);
    }
}

接着由于一些原因,我有用数组做了一下,并分析了一下过程,分析过程如下:

分析:先抛开前三个月份,看第四个月份,你如果想知道第四个月有多少只兔子,那么你就需要弄清楚在第三个月的时候原本有多少只兔子,以及在第四个月有多少兔子要生宝宝,也就是相比于第三个月,第四个月多出来的兔子数量应该是第三个月要生宝宝的兔子数。但是因为刚出生的兔子要经过三个月才能生宝宝,所以说在四月份的时候要生宝宝的兔子数量应该是二月份兔子的数量。然后因为你用数组已经记录了每个月的兔子的数量,所以二月份的兔子数量就是arr[1]。

因此能得到这样的公式:arr[4] = arr[3] + arr[2]

然后按照这个思路继续往下推即可得到:arr[x] = arr[x - 1] + arr[x - 2]

也就是:当月的兔子数量 = 原本的兔子数量 + 在这个月要出生的兔子数量

​ (上个月的兔子数量) (上上个月的兔子数量)

代码如下:

package com.orchestra.exer;

/**
 * 题目描述:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一只兔子,
 *          假如兔子都不死,问第二十个月的兔子对数为多少。
 * @author tree
 * @create 2021-01-20-19:40
 */
public class Rabbit2 {
    public static void main(String[] args) {
        int[] arr = new int[20];
        arr[0] = arr[1] = 1;
        System.out.println(arr.length);
        for (int x = 2; x < arr.length; x++) {
            arr[x] = arr[x - 2] + arr[x - 1];
        }
        System.out.println(arr[19]);
    }
}

posted on 2021-01-20 20:01  南小鸟xxn  阅读(149)  评论(0编辑  收藏  举报