题四:一对兔子生兔子,给个月份算有几只兔子

这个用递归就行,兔子就是个类,他们有自己的行为,这种思路可以帮助我们给兔子建立模型。

免责声明:注意我就是随手一写,对算法效率有要求的慎用

 

写法一:

/**
 * 有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月又生一对兔子,加入兔子都不死,问每个月的兔子总数多少?
 *
 * 月份          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),然后再写个更简单的递归实现;

或者再进一步推导出,斐波那契数列通项公式:

就看你是想充分利用计算机,还是想充分利用你自己的脑子了~

 

posted @ 2018-05-07 18:06  剑握在手  阅读(621)  评论(0编辑  收藏  举报
返回顶部↑