紧急!电脑编程高手请进!C#编程:兔子繁殖问题

兔子繁殖问题。设有一对新生的兔子,从第三个月开始他们每个月都生一对兔子,新生的兔子从第三个月开始又每个月生一对兔子。按此规律,并假定兔子没有死亡,20个月后共有多少个兔子?要求编写为控制台程序。

楼主 晚上睡不着 于是给你用三种方法解答 嘿嘿 不要浪费哦

public class Program
{

static void Main(string[] args)
{

Console.Write("请输入月数:");
string buffer = Console.ReadLine();
int Months = Convert.ToInt32(buffer); //结束月数
CalculateByObjectOriented(Months);
CalculateByRecursion(Months);
CalculateByMathematics(Months);
}

public static void CalculateByObjectOriented(int MonthCount) //面向对象方法实现
{
Console.Write("使用面向对象方法实现,总兔子数:{0}\n" , new RearRing(MonthCount).GetRabbitTotal());
}

public static void CalculateByMathematics(int MonthCount)
{
//能力有限,抽象不出表达式,偷懒一下
//画一个节点图,你就能清楚地看出为什么了
int Period = 3; //出生后第几个月能生小兔
int val1 = 0;
int val2 = 0;
int val3 = 1;
int RubbitsCount = 2;
if (MonthCount > 3)
{
RubbitsCount += val3 * 2;
for (int i = Period + 1; i < MonthCount + 1; i++)
{

val1 = val2;
val2 = val3;
val3 = val2 + val1;
RubbitsCount += val3 * 2;
}
}

Console.Write("使用数学方法实现,总兔子数:{0}\n", RubbitsCount);
}
public static void CalculateByRecursion(int MonthCount) //递归实现
{

Console.Write("使用递归实现,总兔子数:{0}\n" , GetFinalNum(0,MonthCount,0));
}

private static int GetFinalNum(int StartMonth, int MonthCount,int Level) //递归调用
{
int FinalNum=2;
int Period = 3; //出生后第几个月能生小兔
for (int i = StartMonth; i < MonthCount; i++)
{
if (i - StartMonth >= Period-1)
{
FinalNum += GetFinalNum(i, MonthCount, Level + 1);
}
}
//For Debug
//Console.Write("当前级数:{0},共有兔子:{1}\n", Level, FinalNum);
return FinalNum;
}
}

public class RearRing
{
public IList<Rabbits> rabbitsList = new List<Rabbits>();
public RearRing(int MonthCount)
{
rabbitsList.Add(new Rabbits(this));
for (int i = 1; i < MonthCount; i++)
{
int count = rabbitsList.Count; //获取当前兔子数
for(int j=0;j<count;j++)
rabbitsList[j].Grow();
}
}
public int GetRabbitTotal()
{
return Rabbits.RabbitNum;
}
public void Add()
{
Rabbits newRabbits = new Rabbits(this);
rabbitsList.Add(newRabbits);
}
}
public class Rabbits
{
public static int RabbitNum = 0; //兔子总数
private const int BornRabbitNum = 2; //每次出生多少只
private const int Period = 3; //出生后第几个月能生小兔
private int Birthdate = 1; //题目不大明确,刚出生算几个月大?在此假定刚出生1个月大,也就是说,"第三个月开始"表示两轮后
RearRing _rearRing;
public Rabbits(RearRing RearRing)
{
this._rearRing = RearRing;
RabbitNum += BornRabbitNum;
}
public void Grow()
{
Birthdate+=1;
if (Birthdate >= Period)
Bear();
}
private void Bear()
{
_rearRing.Add();
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-06-02
这种问题一般是找出他们之间的关系就可以了。

我找出的关系是:
前2个月都是1对兔子,,第3个月是2对兔子,从第3个月开始,
下月的兔子对数=今月的兔子对数+(年龄>2月的兔子对数)

所以得出的关系就是:
f(n)=1 (n<3);
f(n+1)=f(n)+f(n-2) (n>=3)
或者是(按只数算的)
f(n)=2 (n<3);
f(n+1)=f(n)+f(n-2) (n>=3)

根据以上的关系,可以用递归的思想就很容易写出程序了

public class DiGui
{
public static uint TuZi(uint month)
{
if (month <3 )
{
return 2;
}
else
{
return TuZi(month - 1) + (TuZi(month - 2));
}
}
}

在主函数里面调用一下就行了。你验证一下看看对不。本回答被提问者和网友采纳
第2个回答  2020-01-31
这种问题一般是找出他们之间的关系就可以了。
我找出的关系是:
前2个月都是1对兔子,,第3个月是2对兔子,从第3个月开始,
下月的兔子对数=今月的兔子对数+(年龄>2月的兔子对数)
所以得出的关系就是:
f(n)=1
(n<3);
f(n+1)=f(n)+f(n-2)
(n>=3)
或者是(按只数算的)
f(n)=2
(n<3);
f(n+1)=f(n)+f(n-2)
(n>=3)
根据以上的关系,可以用递归的思想就很容易写出程序了
public
class
DiGui
{
public
static
uint
TuZi(uint
month)
{
if
(month
<3
)
{
return
2;
}
else
{
return
TuZi(month
-
1)
+
(TuZi(month
-
2));
}
}
}
在主函数里面调用一下就行了。你验证一下看看对不。
第3个回答  2012-04-23
//int a, b, c, i;
//a = 1; b = 1;
//for (i = 3; i <= 20; i++)
//{
// c = a + b;
// a = b;
// b = c;
//}
//Console.WriteLine(c);
//Console.ReadKey();
第4个回答  2009-06-02
应该是这个
int Datuzi = 2;
int Xiaotuzi = 0;
for (int i = 0; i <20; i++)
{
Xiaotuzi += Datuzi;

if (i%3==0)//
{
Xiaotuzi -= 2;
Datuzi += 2;
}
}
Console.WriteLine(Datuzi+Xiaotuzi);
相似回答