兔子繁殖问题(考虑兔子会死亡的情况)–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 类型
等等的小细节性的东西。