java:农场一头小母牛,每年生头小母牛,母牛5岁产母牛,20年上多少牛?

1.分析:

1.1描述

农场开始有一头具有生育能力(年龄大于5岁)的母牛,以后每年都会生小母牛,而小母牛5年长大后又能生小母牛,从面向对象的角度分析,生小母牛的能力,

属于母牛对象,我们可以把它定义为一个内部方法;农场容纳着母牛及生产的小母牛,我们可以在农场内部维护一个长度可变的容器(集合),存储所有的母牛;

随着时间的变化,母牛的年龄在变化,农场的母牛数量也在变化,我们可以在农场中定义一个随着时间变化,而同时改变农场属性(母牛数量)和母牛属性(年龄)

功能的方法。

1.2对象

农场和母牛(属性:年龄)

对象的关系,农场和母牛是组合关系

2.把对象转换为类

2.1母牛对象

        年龄属性age及生育小母牛方法produceCow

public class Cow {
	private int age;

	public Cow(int age) {
		this.age = age;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Cow produceCow() {
		if (age >= 5) {
			return new Cow(1);
		}
		return null;
	}
}

2.2农场对象和母牛为组合关系

        初始化了一头年龄为5的母牛,内部维护了一个母牛集合(cows),以及随着时间变化后获取母牛数量的方法getCows(int year)

public class Farm {
	private static List<Cow> cows;//农场的奶牛群集合
	//新建农场时的初始化,初始化一头具有生育能力的母牛(年龄5岁以上)
	static{
		cows = new ArrayList<>();
		Cow cow = new Cow(5);
		cows.add(cow);
	}
	//获取第year年上的母牛对象集合
	public static List<Cow> getCows(int year){
		for(int i=0;i<year;i++){		//奶牛场year年的变化,从第0年到第year年(共year年)
			List<Cow> tempCows = new ArrayList<>();//新一年变化,统计农场奶牛数量时,新建一个临时奶牛圈,圈住已有的奶牛和新生的奶牛
			for(Cow cow:cows){ //遍历已有奶牛圈
				tempCows.add(cow);//将原奶牛加入新奶牛圈
				cow.setAge(cow.getAge()+1);//原奶牛年龄+1
				Cow smalCow = cow.produceCow();//原奶牛自己判断自己年龄,如果到了生育期(5岁),自动生一头小奶牛,没到5岁,返回null
				if(smalCow!=null){
					tempCows.add(smalCow);//将新生的小奶牛加入新奶牛圈
				}
			}
			cows = tempCows;//统计所有奶牛结束,将临时奶牛圈中的所有奶牛赶入农场原有奶牛圈
			System.out.printf("第%d年奶牛数量:%d%n",i+1,cows.size());
			tempCows=null;//撤掉临时奶牛圈
		}
		return cows;//返回第year年后农场的奶牛群
	}
}	

2.3测试

	public static void main(String[] args) {
		Farm.getCows(20);
	}

测试结果如下:

第1年奶牛数量:2
第2年奶牛数量:3
第3年奶牛数量:4
第4年奶牛数量:5
第5年奶牛数量:7
第6年奶牛数量:10
第7年奶牛数量:14
第8年奶牛数量:19
第9年奶牛数量:26
第10年奶牛数量:36
第11年奶牛数量:50
第12年奶牛数量:69
第13年奶牛数量:95
第14年奶牛数量:131
第15年奶牛数量:181
第16年奶牛数量:250
第17年奶牛数量:345
第18年奶牛数量:476
第19年奶牛数量:657
第20年奶牛数量:907

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kenick

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值