Java算法:关于猴子的繁殖问题

furway 2014-03-27 10:53:03
第一年,年初,只有2只成年猴子,一公一母。
年底的时候,猴子会交配,所有母猴子都会生一个孩子(不考虑怀孕经历的时间),小猴子有可能是公的,也可能是母的。

小猴子出生后,第一年年底不能生子,第二年年底(2周岁)才能成年,生子。

写 猴子类, 每个类实例,代表一只猴子。
用程序演算, 从第一年年初,到第100年年底,算上年底新出生的小猴子, 一共有多少只猴子
...全文
419 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mich_LY 2014-03-31
  • 打赏
  • 举报
回复
引用 12 楼 forgetsam 的回复:
引用 11 楼 u012974494 的回复:
[quote=引用 10 楼 forgetsam 的回复:] 兔子是无性生殖?
兔子是有性繁殖,但是斐波那契数列中的兔子是一对一对生的,一对兔子必能生出一对兔子,问题在楼主这个问题在于,猴子生出的分公母,公猴子是不能繁殖的
兔子不分公母,一对兔子必能生出一对兔子,受教了。 编程级别的算法不会考虑现实和概率的。 这种SB题目的出题人的意思就是:猴子的生殖周期不像兔子,在总数为奇数年份要减掉多出的“一只”,取个整而已。 性别随机你的代码能写出来?写个看看。 [/quote]如果这题目是算法题,就不会要求写一个猴子的类了,而且题目还说了每个类的实例代表一个猴子,出题者肯定是为了模拟实际,只不过没有考虑过100年生成的实例足以挤爆内存而已,至于性别随机,只要各50%就好了,不是这题的关键,要真的写,也只有精通生物学的来了
Mich_LY 2014-03-28
  • 打赏
  • 举报
回复
发现是jvm内存太小的问题...再怎么管理也会溢出,应该即时销毁不需要的数据...好吧,我写错了
Mich_LY 2014-03-28
  • 打赏
  • 举报
回复
前面初始写错了...应该年龄设置为2
Mich_LY 2014-03-28
  • 打赏
  • 举报
回复

public class Monkey {
	public enum Sex {
		MALE, FEMALE;
	}

	private Sex sex;
	private int age;

	public Sex getSex() {
		return sex;
	}

	public void setSex(Sex sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

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

	public boolean isAdault() {
		if (age > 1) {
			return true;
		} else
			return false;
	}

	public void growUp() {
		this.age++;
	}
}
这时java实体类,比较简单,计算如下

public static int calMonkeys(int years) {
		// 由于100年产生的猴子过多,存放在同一个list会溢出,所以通过map将猴子进行分组,分别存在不同的list中去
		Map<Integer, List<Monkey>> monkeyGroup = new HashMap<Integer, List<Monkey>>();
		Map<Integer, List<Monkey>> newBornedGroup = new HashMap<Integer, List<Monkey>>();
		List<Monkey> group0 = new ArrayList<Monkey>();// 初始化第一组猴子
		Monkey monkeyFst = new Monkey();
		monkeyFst.setAge(1);
		monkeyFst.setSex(Sex.MALE);
		Monkey monkeyScd = new Monkey();
		monkeyScd.setAge(1);
		monkeyScd.setSex(Sex.FEMALE);
		group0.add(monkeyFst);
		group0.add(monkeyScd);
		monkeyGroup.put(0, group0);
		int monkeyNum = 2;
		boolean overMemeory = false;// 判断每一组的猴子数量是否过大
		for (int i = 0; i < years; i++) {
			List<Monkey> bornedmonkeys = new ArrayList<Monkey>();// 设置第一组新生猴子的集合
			Set<Integer> group = monkeyGroup.keySet();
			for (Integer groupNum : group) {// 选择每一组猴子
				List<Monkey> monkeys = monkeyGroup.get(groupNum);
				for (Monkey monkey : monkeys) {// 生小猴子
					monkey.growUp();// 猴子涨一岁
					if (monkey.getSex().equals(Sex.FEMALE) && monkey.isAdault()) {
						Monkey bornedMonkey = new Monkey();
						bornedMonkey.setAge(0);
						if (Math.random() > 0.5)
							bornedMonkey.setSex(Sex.FEMALE);
						else
							bornedMonkey.setSex(Sex.MALE);
						bornedmonkeys.add(bornedMonkey);
						monkeyNum++;
					}
				}
				if (monkeys.size() > 10000) {
					continue;
				}
				monkeys.addAll(bornedmonkeys);
				if (monkeys.size() > 10000) {
					overMemeory = true;
				}
			}
			if (overMemeory) {
				monkeyGroup.put(i + 1, new ArrayList<Monkey>());
				overMemeory = false;
			}

		}
		return monkeyNum;
	}
但是还有问题,当每年增长的猴子过大时,同样也会数组溢出
wenhaoxp1987 2014-03-28
  • 打赏
  • 举报
回复
问题不清,有歧义 1.生过猴子的能还能不能再生。 2.一开始大猴生小候,就出来一个,怎么产生后代,难不成乱伦,如果是,可以和谁生都可以,又是一个扯不清的问题了,不过不是。
Mich_LY 2014-03-28
  • 打赏
  • 举报
回复
问题本身很简单,但是由于100年太大了,所以如果存放在一个list会内存溢出
机器学习之禅 2014-03-28
  • 打赏
  • 举报
回复
这个好有难度,想不出来。。。。不知道公母啊 还得随机生成
Mich_LY 2014-03-28
  • 打赏
  • 举报
回复
这个问题没说清啊,既然不能确定公母又怎么计算呢?至少给个比例吧
forgetsam 2014-03-28
  • 打赏
  • 举报
回复
引用 11 楼 u012974494 的回复:
引用 10 楼 forgetsam 的回复:
兔子是无性生殖?
兔子是有性繁殖,但是斐波那契数列中的兔子是一对一对生的,一对兔子必能生出一对兔子,问题在楼主这个问题在于,猴子生出的分公母,公猴子是不能繁殖的
兔子不分公母,一对兔子必能生出一对兔子,受教了。 编程级别的算法不会考虑现实和概率的。 这种SB题目的出题人的意思就是:猴子的生殖周期不像兔子,在总数为奇数年份要减掉多出的“一只”,取个整而已。 性别随机你的代码能写出来?写个看看。
Mich_LY 2014-03-28
  • 打赏
  • 举报
回复
引用 10 楼 forgetsam 的回复:
[quote=引用 9 楼 u012974494 的回复:] [quote=引用 8 楼 forgetsam 的回复:] 一个递归100次的函数能把JVM弄溢出了,你得写成什么样啊? 至于楼主的问题,自行搜索斐波那契。
斐波那契只能解决无性繁殖,对于随机生成性别的繁殖没有用吧[/quote] 兔子是无性生殖?[/quote]兔子是有性繁殖,但是斐波那契数列中的兔子是一对一对生的,一对兔子必能生出一对兔子,问题在楼主这个问题在于,猴子生出的分公母,公猴子是不能繁殖的
forgetsam 2014-03-28
  • 打赏
  • 举报
回复
引用 9 楼 u012974494 的回复:
[quote=引用 8 楼 forgetsam 的回复:] 一个递归100次的函数能把JVM弄溢出了,你得写成什么样啊? 至于楼主的问题,自行搜索斐波那契。
斐波那契只能解决无性繁殖,对于随机生成性别的繁殖没有用吧[/quote] 兔子是无性生殖?
Mich_LY 2014-03-28
  • 打赏
  • 举报
回复
引用 8 楼 forgetsam 的回复:
一个递归100次的函数能把JVM弄溢出了,你得写成什么样啊? 至于楼主的问题,自行搜索斐波那契。
斐波那契只能解决无性繁殖,对于随机生成性别的繁殖没有用吧
forgetsam 2014-03-28
  • 打赏
  • 举报
回复
一个递归100次的函数能把JVM弄溢出了,你得写成什么样啊? 至于楼主的问题,自行搜索斐波那契。

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧