java经典算法-兔子问题

问题:有一只兔子,从第3个月开始每月生1只兔子,小兔子长到第3个月开始每个月也会生1只兔子,假如兔子都不死,问每个月的兔子总数是多少?

分析:乍一看觉得问题挺复杂,仔细分析之后发现,兔龄2个月及2个月以上的兔子在新的1个月每只都会生1只兔子。对于新的这个月来说,之前兔龄2个月及2个月以上的兔子就是2个月前的兔子总数,也就是说新的1个月相比上1个月增加的兔子数是2个月前的兔子数,其实就是当月的兔子数等于前两个月的兔子数之和。这样一分析,问题就很简单了,目前有两种实现方式,递归的和非递归的。先来看非递归的:

    private static void rabbitTest1() {
        int sum_rabbit = 1;   //兔子总数
        int one_ago_rabbit = 1;   //1个月前兔子总数
        int two_ago_rabbit = 1;   //2个月前兔子总数
        for (int month = 1; month < 11; month++) {
            if (month < 3) {
                sum_rabbit = 1;
            } else {
                sum_rabbit = one_ago_rabbit + two_ago_rabbit;
                two_ago_rabbit = one_ago_rabbit;
                one_ago_rabbit = sum_rabbit;
            }
            System.out.println("第" + month + "个月" + sum_rabbit + "只兔子");
        }
    }

执行结果:

再来看递归的方法:

    private static void rabbitTest2() {
        for (int i = 1; i < 11; i++) {
            System.out.println("第" + i + "个月" + rabbit(i) + "只兔子");
        }
    }

    private static int rabbit(int month) {
        if (month < 3) {
            return 1;
        } else {
            return rabbit(month -2) + rabbit(month - 1);
        }
    }

执行结果:

两种方法思路和结果其实是一致的。

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页