非常有趣的递归问题(最近面试问到的)

本文通过两种方法解决经典的兔子繁殖问题:一种是基于类对象的方法,通过创建Rabbit类来模拟每个月兔子的成长和繁殖过程;另一种是使用递归方法,利用数学规律快速计算任意月份的兔子总数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 古典问题:第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(意味着生长期为2)
    这里我采用两种结题思路
  2. 第一种不考虑递归,采用字面解释进行基于类对象的做法
class Rabbit {

    public int month;     //代表成长了几个月
    public boolean bltn;  //代表是否新生
    public String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public boolean isBltn() {
        return bltn;
    }

    public void setBltn(boolean bltn) {
        this.bltn = bltn;
    }

    public Rabbit(int month,boolean bltn,String name) {
        super();
        this.bltn = bltn;
        this.month = month;
        this.name = name;
    }

    public Rabbit() {
        super();
    }

    @Override
    public String toString() {
        return "Rabbit [month=" + month + ", bltn=" + bltn + ", name=" + name + "]";
    }

}
    public static Integer getNumRabbit(Integer month) {
        // 1、设置CurrentList兔子的数量
        List<Rabbit> rabbitList = new ArrayList<Rabbit>();
        rabbitList.add(new Rabbit(1,true,"一代"));//设置第一代兔子,初始月为1
        //if(month==1||month==2) {     //加不加都行
        //  return rabbitList.size();
        //}
        for (int i = 2; i <= month; i++) { //从2月份开始
            List<Rabbit> incrList = new ArrayList<Rabbit>();
            Iterator<Rabbit> iterator = rabbitList.iterator();
            while(iterator.hasNext()){
                Rabbit ra = iterator.next();
                if (ra.month%2==0&&ra.bltn) { //判断是不是可以变成成熟期
                    ra.bltn = false;
                }
                if(!ra.bltn) {//成熟一直生产
                    incrList.add(new Rabbit(1,true,ra.getName()+"i"));
                }
                ra.month ++ ;
            }
            rabbitList.addAll(incrList);
            System.out.println(rabbitList.toString());
        }

        return rabbitList.size();
    }
  1. 第二种采用递归的方式,首先找到规律
 //一月   二月  三月  四月  五月  六月  七月
 //1      1    2     3     5    8     13
 //则有f(x)=f(x-1)+f(x-2)

这个采用的是递归方式

  1. 为什么采用递归方式,你可以试试比较这两种方法处理2*12个月的数据,果然递归的效率杠杠的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值