java兔子繁殖_兔子繁衍问题 (考虑死亡)

本文介绍了一个考虑兔子死亡情况的兔子繁殖问题,通过观察规律得出递推公式,并使用Java实现动态规划解决方案。代码中利用HashMap优化,重点考察逻辑思维能力和Java大数处理。
摘要由CSDN通过智能技术生成

兔子繁殖问题(考虑兔子会死亡的情况)–java实现

问题描述:

在一片广袤无垠的大草原上,生活一羣兔子;无需考虑性别,每只兔子每年年末都会生2只小兔子,这2只小兔子在第二年年末也会生2只小兔子;

兔子能活5年,5岁的兔子不能在那年生小兔子;假如第一年年中,草原上有10只未满1岁的兔子,他们在年末都会开始生小兔子,请问,第N年年中,草原上有多少只兔子?

思路整理:

1 首先需要找到这道题的规律

第一年:                            10——兔子的总数    10

第二年:                       10       20——兔子的总数30新出生的兔子  20

第三年:                   10       2060——兔子的总数90新出生的兔子  60

第四年:             10      20    60180——兔子的总数270新出生的兔子  180

第五年:        10     20     60     180      540                   ——兔子的总数810新出生的兔子  540

第六年:1020     60     1805401600——兔子的总数2400新出生的兔子  1600死亡的兔10

第七年:2060     18054016004760——兔子的总数7140新出生的兔子  4760死亡的兔20

。。。。。

2

A  找到规律后可以发现 这道题感觉像一颗二叉树,继续吧问题的规律总结出来。到了第六年的时候第一年的兔子会死掉。并且不会生育出新的兔子,就是说在第六年的时候没有第一年兔子的后代。

B 前五年的规律很好找 F(N)= F(N-1) * 3;之后的规律需要总结出看上图看可以明显的得出 第六年死去的兔子就是第一年出生的,第七年死亡的兔子就是第二年出生的所以每年新出生的兔子 = 这年所有的兔子总数的2/3递推公式可以得出

F(N)  = (F(N-1) – F(N-5)*2/3)  *3         当N>6时成立

3   是不是能使用递归的思路,这里可以类比动态规划的求解。

确定以下三点  【最优子结构】

【边界】

【状态转移方程】

程序实现

package algorithm;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Set;

public class Test {

public static Long count(int n, HashMap map){

if(n<1){

return 0l;

}

if(n==1){

return 10l;

}

if(n==2){

return 30l;

}

if(n==3){

return 90l;

}

if(n==4){

return 270l;

}

if(n==5){

return 810l;

}

if(n==6){

return 2400l;

}

if(map.containsKey(n)){

return map.get(n);

}

else{

Long value = (count(n-1,map)*3-count(n-5,map)*2);//前一年所有的兔子减去五年前新出生的兔子 再乘3

map.put( n, value);

return value;

}

}

public static void main(String[] args) {

HashMap map =new HashMap(); //使用Hashmap 哈希表保存已经算过的

System.out.println(count(6,map));

}

}

代码是已经使用HashMap 作为字典优化过的。

其中主要涉及到的面试的知识点就是逻辑思维能力,和 java中的一些大数字的处理比如我们常常使用的Long 类型

等等的小细节性的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值