题四:一对兔子生兔子,给个月份算有几只兔子
这个用递归就行,兔子就是个类,他们有自己的行为,这种思路可以帮助我们给兔子建立模型。
免责声明:注意我就是随手一写,对算法效率有要求的慎用
写法一:
/** * 有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月又生一对兔子,加入兔子都不死,问每个月的兔子总数多少? * * 月份 1、2、3、4、5、6、7、8、9、10、11、12 * 兔子对数: 1、1、2、3、5、8、13、21、34、55、89、144 */ public class Test4 { public static void main(String[] args) { RabbitPair rabbitPair = new RabbitPair(12); System.out.println(rabbitPair.getPairCount()*2); } } class RabbitPair{ int month; public RabbitPair(int month){ this.month = month; } public int getPairCount(){
//这里的count代表自己这一对,每对兔子计算的时候都算上自己这一对,后边就不用再进行复杂的计算了 int count = 1; if(month<3){ return count; }else{ //这几个月一共生了month-2对兔子,每对兔子都具有RabbitPair的getPaircount特性 for(int i=month-2;i>0;i--){ count+= new RabbitPair(i).getPairCount(); } return count; } } }
写法二:
当然上边的代码也可以精简,但是就显得不是那么平易近人了,因为你不能一下看出这个是怎么得到的,简化后:
/** * 有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月又生一对兔子,假如兔子都不死,问每个月的兔子总数多少? * * 月份 1、2、3、4、5、6、7、8、9、10、11、12 * 兔子对数: 1、1、2、3、5、8、13、21、34、55、89、144 */ public class Test4 { public static void main(String[] args) { int month = 12; System.out.println(getPairCount(month)*2); } public static int getPairCount(int month){ int count = 1; if(month<3){ return count; }else{ for(int i=month-2;i>0;i--){ count+= getPairCount(i); } return count; } } }
当然你可以当个数学家,
推导出f(n)=f(n-1)+f(n-2),然后再写个更简单的递归实现;
或者再进一步推导出,斐波那契数列通项公式:
就看你是想充分利用计算机,还是想充分利用你自己的脑子了~