生兔子问题

面试的时候做一道算法题,生兔子问题,当时想得有点困难,面试结束回家后,搜了一下。然后再验证一下面试时的思路是否正确。

问题描述: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,计算第50个月兔子的总数?

搜过之后知道这是一道递归问题,面试的时候可能想的不太清晰,走进了一点误区,没有想到这一点,下面是我顺着面试时思路完善的代码。发现和搜到的答案递归解法(参考博客)结果是一样的,证明我的思路也是可以走通,这里贴一下代码。仅供参考。

	/**
     * 获取兔子总数量
     * @param month 月份
     * @Date: 2019/10/24
     * @return: int
     */
    private int getRabbitCount(int month) {
    	/** 新生兔子 */
        int oneMonth = 1;
        /** 第二个月的兔子 */
        int twoMonth = 0;
        /** 第三个月的兔子 能生新兔子 */
        int oldRabbit = 0;
        /** 兔子总数 */
        int totalCount;

        for(int i = 0; i < month - 1; i++) {
            oldRabbit += twoMonth;
            twoMonth = oneMonth;
            oneMonth = oldRabbit;
        }
        System.out.println(oneMonth + " " + twoMonth + " " + oldRabbit);
        totalCount = oneMonth + twoMonth + oldRabbit;
        return totalCount;
    }

总结: 面试的时候for中条件写的是 i < month 忽略了其实我已经在循环外将第一个月的兔子数初始化了,应该从循环中减掉一次结果才正确。对于递归来说,这个可能更好理解一点,不过递归写出来就是简洁,那是没话说。在效率上还没有进行过测试,如果有时间,再算吧。不过猜测应该是递归更高效吧。

效率测试

不知道是不是我的幻觉,经过简单测试后,我发现我的写法竟然比递归方法查询的更快。。。。阿门,这个程序当参数传入40多的时候会出现卡死的情况,估计是结果超出了int范围造成的,有兴趣的可以修改为BigDecimal类型进行测试.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值