用面向对象的思想解决不死神兔问题(斐波那契数列)

本文介绍了一个经典的兔子繁殖问题,并使用面向对象的方法进行了解决。通过定义一个兔子类,实现了兔子的成长与繁殖行为,进而计算出指定月份的兔子总数。

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

/**
 *    有一对兔子,从出生后第3个月起每个月都生一对兔子,
 *    小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
 *
 *    规律分析: 1,1,2,3,5,8,13,21,34...
 */

说起这个问题,可能第一反应大多都是递归解决.其实,这个问题同样也可以用面向对象的思想来解决.好啦话不多说上代码.

首先,把兔子作为一个实体类封装起来,它具有年龄属性以及成长,繁殖的行为.

/**
 * 兔子
 */
public class Rabbit {
    /**
     * 年龄
     */
    private int age;

    /**
     * 成长
     */
    public void grow() {
        ++age;
    }

    /**
     * 繁殖
     */
    public Rabbit breed() {
        //每只兔子最少两岁才具有繁殖能力
        if (age >= 2) {
            return new Rabbit();
        }
        return null;
    }
}

具体实现:

public class Test {

    public static void main(String[] args) {

        int month = 12;
        int count = oop(month);

        System.out.println("第" + month + "个月的兔子总数是" + count + "只");
    }

    private static int oop(int month) {

        List<Rabbit> family = new ArrayList<>();    //兔子家族
        family.add(new Rabbit());   //第一位家族成员诞生,它是兔子鼻祖

        for (int i = 1; i < month; i++){    //每循环一次,代表过一个月
            for (Rabbit r : new ArrayList<Rabbit>(family)) {    //所有家族成员年龄增加,并开始繁殖
                r.grow();
                Rabbit baby = r.breed();
                if (baby != null) {
                    family.add(baby);   //新的baby也会加入家族中
                }
            }
        }
        return family.size();   //最终,返回家族中的成员数量
    }
}

运行结果:

第12个月的兔子总数是144只

怎么样,通过这个小小demo有没有让你感受到OOP思想的强大之处呢?

也顺便附上递归代码:

public class Test {

    public static void main(String[] args) {

        int month = 12;
        int count = recursion(month);

        System.out.println("第" + month + "个月的兔子总数是" + count + "只");
    }

    private static int recursion(int month) {

        if (month == 1 || month == 2) {
            return 1;
        } else {
            return recursion(month - 1) + recursion(month - 2);
        }
    }
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值