//按照规律来找 比较简单 //定义三种兔子 一个月大的小兔子 两个月大的中兔子 三个月及以上的大兔子 //小=大+中 //大=中+大 //中=小 public static int rabbitsMonth(int month){ int a = 0; //大 int b = 0; //中 int c = 1; //小 if(month == 1){ return (a+b+c); } for(int i=2;i<=month;i++){ int tempC = c; c = a + b; a = a + b; b = tempC; } return (a+b+c); }
}
class PairRabbit{ // 1 ,2 ,3 private int age; private List childen = new ArrayList();
public PairRabbit(){ this.age = 1; }
//生产小兔子的方法 public void makeRabbit(){ PairRabbit rabbit = null ; if(age<0) return; switch(age){ case 1 : break; case 2 : break; default: rabbit = new PairRabbit(); if(childen.size()>0){ for(PairRabbit p : childen){ p.setAge(p.getAge()+1); } } childen.add(rabbit); break; } }
//获取这对兔子的所有孩子的对数 public int getChildNum(){ int childNum = 0; for(int i=0;i<(age-2);i++){ makeRabbit(); } childNum = getChilden().size(); return childNum; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public List getChilden() { for(int i=0;i<(getAge()-2);i++){ makeRabbit(); } return childen; }
public void setChilden(List childen) { this.childen = childen; }
}
class RabbitManager{ //所有兔子的子孙 List all ;
public RabbitManager(){ all = new ArrayList(); }
//通过第一对兔子获取他所有的子孙兔子 好比根节点获取所有衍生出来的子节点 public void getAllChilden(PairRabbit rp){ List rabbits = rp.getChilden(); all.addAll(rabbits); if(rabbits.size()>0){ for(PairRabbit rp1 : rabbits){ getAllChilden(rp1); } } }
//返回所有兔子的数量 public int getAll(int month){ int sum = 0; PairRabbit rp = new PairRabbit(); rp.setAge(month); getAllChilden(rp); sum = all.size()+1; return sum; } }