网上的一道题目整理 《加上了我的注释》很值得看看

通过两种不同的编程方法解决了一个关于牛群数量随时间增长的问题。一种是递归算法,另一种是面向对象的方法。这两种方法都能有效地计算出任意年份内牛群的总数。

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

 网上的一道题目整理 《加上了我的注释》很值得看看

 

 

一个农夫养了一头牛,三年后,这头牛每年会生出1头牛,生出来的牛三年后,又可以每年生出一头牛……问农夫10年后有多少头牛?n年呢?(用JAVA实现)

草根答案1

public class Cow {

private int age;                     //设置年份

public Cow(){

age = 0;                           //够着函数 age赋值

}  

public Cow play(){

age ++;

return age > 2 ? new Cow():null;     // 如果age 大于 2 ,就生产一个小牛,嘿嘿 我杜撰的名 ,感觉好理解些 ,还有这里如果2改称为 3 就和题目接近了。

}

}

 

public class Test {

 

public static void main(String[] args) {

List <Cow> list = new ArrayList <Cow>();

list.add(new Cow());                          //开始List里面只有一个牛

 

for(int i = 0; i < 10;i++){                        //年份循环

for(int j =0;j <list.size();j++){                    //在具体的那一根年份里面 ,对每一头牛,而言

Cow cow = list.get(j).play();                    // 如果大于两年 (正确答案该是三年),每一个存在的牛仔就会生一个小牛

if(cow != null) list.add(cow);

}

System.out.println("" + (i+1)+"年,共有:" + list.size());

}

}

 

}

 

1年,共有:1

2年,共有:1

3年,共有:2

4年,共有:3

5年,共有:5

6年,共有:8

7年,共有:13

8年,共有:21

9年,共有:34

10年,共有:55

 

草根答案2

public class OxProblem {

    public static void main(String[] args) {

        for(int i=1;i<=20;i++){

            System.out.println(""+i+"年牛的数量:"+getOxs(i));

        }

 

    }

    public static int getOxs(int n){

        int answer = 0;

        if(n>=3){

            answer = 1;

            for(int i=1;i<=n-2;i++){

                answer += getOxs(i);

            }

        }else{

            answer = 1;

        }

        return answer;

    }

}

1年牛的数量:1

2年牛的数量:1

3年牛的数量:2

4年牛的数量:3

5年牛的数量:5

6年牛的数量:8

7年牛的数量:13

8年牛的数量:21

9年牛的数量:34

10年牛的数量:55

11年牛的数量:89

12年牛的数量:144

13年牛的数量:233

14年牛的数量:377

15年牛的数量:610

16年牛的数量:987

17年牛的数量:1597

18年牛的数量:2584

19年牛的数量:4181

20年牛的数量:6765

 

 

总结 整理

 

 

 

好多人貌似没看清楚题,是三年后,不是第三年,放出两种解题思路,一种是递归,一种是面向对象的思维,第二个很经典,面试的时候能写出第二个这样的代码,会添色不少。
1.
递归(结果为28,如果要算n年后的结果,只需将10改为n)

 

public class Cow {

    static int count = 1; 

    private static void feedCow(int year,int age){

        year++;

        age++;

        if(year<=10){                        //递归的调用 Year 大于十年的时候 不递归了

            if(age>=3){                    //如果年龄大于三岁的牛就开始生产

                count++;

                feedCow(year,0);

            }

            feedCow(year,age);

        }

    }

 

    public static void main(String[] args) {

        new Cow().feedCow(0, 0);

        System.out.println(count);

    }

}

运行结果:

2面向对象(很经典的思路,结果当然是28,要求n年后,只需将i <10改为i <n

public class Cow {

    public static int count = 0;

    public Cow(int year){

        count++;

        for(int i=3+year;i<=10;i++){

            new Cow(i);

        }

    }

 

    public static void main(String[] args) {

        new Cow(0);

        System.out.println(count);

    }

}

 

 

 

输出的运算结果 :28

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值