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

本文通过兔子繁殖问题引入递归算法的概念,并提供两种不同的Java实现方式,一种较为直观但效率较低,另一种则更为简洁高效。此外还提及了数学上的解决思路,即斐波那契数列。

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

写法一:

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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值