不死神兔

  • 方法一之找规律
  • 方法二之暴力


题目:有一个很有名的数学逻辑题叫做不死神兔问题。有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?

方法一之找规律

如何锻炼java中逻辑思维 java思维逻辑题_数组


通过这张图,我们可以明确的看到,一月有一只兔子,二月有一只,三月有两个,四月有五只。。。。。

得到一组数据(1,1,2,3,5,8,13…)我们可以发现,从三月开始,兔子数量为上两月之和。

那么就能操作了:
①定义一个数组
②将一月和二月的兔纸数量赋值
③循环计算每个月兔纸数量
④输出

参考代码:

public class Test04 {
    public static void main(String[] args) {
        //为了存储多个月的兔子对数,定义一个数组,用动态初始化完成数组元素的初始化,长度为20
        int[] arr = new int[20];
        //因为第1个月,第2个月兔子的对数是已知的,都是1,所以数组的第1个元素,第2个元素值也都是1
        arr[0] = 1;
        arr[1] = 1;
        //用循环实现计算每个月的兔子对数
        for(int x=2; x<arr.length; x++) {
            arr[x] = arr[x-2] + arr[x-1];
        }
        //输出数组中最后一个元素的值,就是第20个月的兔子对数
        System.out.println("第二十个月兔子的对数是:" + arr[19]);
    }
}

方法二之暴力

找规律什么的才不喜欢,还是比较喜欢暴力,当然,暴力也是需要找一点点规律的,不然怎么暴力啊


一月

二月

三月

第一月

1

0

0

第二月

0

1

0

第三月

1

0

1

第三月

1

1

1

根据题意,兔子会长大,当兔子长到第三个月的时候,会生一个一月的兔子。因为兔子会长大,由此,可以判断出,下个月新生的兔子数量,将会等于上个月出生的兔子数量,而上个月出生的兔子数量是由二月和三月决定的(因为二月会长成三月),所以下个月新生的兔子数量等于上个月二月加三月之和,而下个月二月的兔子数量自然等于上个月一月兔子的数量,因为长大了,同理,下个月三月的兔子数量等于上个月二月加三月(因为兔子是不死的)。这么多字可能看懵了吧,下面是操作流程

①定义一月、二月和三月的兔子,并赋初值
②定义下个月中一月、二月、三月的兔纸,赋初值为零(这里有个注意事项,我运行过程中才发现的,因为下个月一月的兔子是由上个月二月和三月共同决定的,而下个月的三月的兔子也是由上个月二月和三月决定的,所以他们相等,也就是说下个月的三月兔子是不用定义的)
③定义循环
④输出结果

代码有瑕疵,将就着看吧

public class ImmortalRabbit {
    public static void main(String[] args) {
        int yiyue=1,eryue=0,sanyue=0;
        int yiyueti=0,eryueti=0,sanyueti=0;
        for(int i=0;i<19;i++){
            yiyueti=yiyue;
            eryueti=eryue;
//            sanyueti=sanyue;
            eryue=yiyueti;
            sanyue+=eryueti;
            yiyue=sanyue;
        }
        System.out.println(yiyue+eryue+sanyue);
    }
}