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

执行结果:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值