上世纪初澳大利亚人从欧洲引入一对幼兔子,如今已经过了百年后能变成多少兔子?
条件:
1.6个月成熟结婚。
2.每三个月生6个兔子。
3.兔子寿命十年。
不考虑生老病死,不考虑近亲结婚,那么100年后,存量兔子会不会是个天文数字,请用程序计算出来?
解题思路
1.设计类1兔子类rabbit.cs
2.设计一个家庭类family.cs
3.在来一个计算类。按月份时间前进的关系计算每个月兔子的数量。
个人计算的结果仅仅能运算到7年就会内存不够用:7年兔子繁殖已经达到千万级别了,20719376只。
如果要算100年,得用超级计算机,而且还要优化算法,简单预测下:
根据已有的数据推测,8年2亿左右,9年20亿,10年200亿,11年2000亿。。。。。。。
代码算法。
第一个类,兔子
namespace StudyMain.Designpattern
{
public class Rabbit {
/// <summary> /// 年龄月 /// </summary> public int mouthOld = 0;
}
}
第二个类兔子家庭
namespace StudyMain.Designpattern
{
/// <summary> /// 一个家庭 /// </summary> public class Family {
//爸爸 private Rabbit man;
//妈妈 private Rabbit Womon;
/// <summary> /// 孩子们 /// </summary> private List<int> Clildrens
= new List<int>();
/// <summary> /// 家庭年龄 /// </summary> private int familyMonthOld = 0;
public bool isDead = false;
public Family(Rabbit pMan, Rabbit pWoman)
{
man = pMan;
Womon = pWoman;
}
/// <summary> /// 一个家庭每个月发生一次变化 /// </summary> public decimal Action(List<Family> listFamily)
{
int coungChange = 0;
//月份自加 familyMonthOld = familyMonthOld + 1;
//兔子年龄 man.mouthOld = man.mouthOld + 1;
if (man.mouthOld >= 120)
{
isDead = true;
decimal chear=-Clildrens.Count * 6;
//夫妻死亡,小兔子死亡,家庭库存小兔子灭亡 return chear - 2;
}
if (familyMonthOld % 3 == 0)
{
//生六个孩子 Clildrens.Add(familyMonthOld);
coungChange = coungChange + 6;
}
foreach (int keys in Clildrens)
{
//6个月大了 if (familyMonthOld - keys == 6)
{
//组建三个家庭 for (int i = 0; i < 3; i++)
{
Rabbit rabbitMan = new Rabbit() { mouthOld = 6 };
Rabbit rabbitWoMan = new Rabbit() { mouthOld = 6 };
Family family = new Family(rabbitMan, rabbitWoMan);
listFamily.Add(family);
}
Clildrens.Remove(keys);
}
break;
}
return coungChange;
}
}
}
第三个类计算类
class AllRabbitCount {
public decimal GetAllRabbitCount(int futureYear)
{
//总共的月份 int allMonth = futureYear * 12;
//总的兔子数量 decimal rabbitCount = 2;
//兔子爸爸 Rabbit man = new Rabbit() { mouthOld=6 };
//兔子妈妈 Rabbit woman = new Rabbit() { mouthOld = 6 };
List<Family> listfamily = new List<Family>();
for (int i = 0; i < allMonth; i++)
{
if (i == 6)
{
//产生了第一个家庭 Family family = new Family(man, woman);
listfamily.Add(family);
}
else if (i > 6)
{
List<Family> listfamilyTemp = new List<Family>();
foreach (Family family in listfamily)
{
rabbitCount = rabbitCount + family.Action(listfamilyTemp);
}
//删除掉已经死亡的家庭 listfamily.ForEach(x =>
{
if (x.isDead)
{
listfamily.Remove(x);
}
});
listfamily.AddRange(listfamilyTemp);
}
}
return rabbitCount;
}
}