一个经典的算法,兔子生小兔子。一对兔子三个月大之后每月都会会生一对兔子,假如有一对刚出生的小兔子,并且兔子都不会死,问一年一共可以繁殖多少兔子?每月各是多少对?
这个算法很简单,但小可愚钝,想了好久也没有想出个答案,于是在网上搜出了答案。
对数
第一月 1
第二月 1
第三月 2
第四月 3
第五月 5
第六月 8
第七月 13
第八月 21
第九月 34
第十月 55
第十一月 89
第十二月 144
算法的思想是当月的兔子数量是前两个月的兔子数量相加,答案并没有给出解释为什么是前两个月数量相加,小可苦想许久终于明白了:
因为兔子都不会死,所以如果想算出下一月的兔子的对数,则需要在本月的兔子的对数基础上再加上在下月会生兔子的那些兔子的对数(m+n),很明显,下月新生的小兔子的对数就等于下月会生小兔子的兔子对数,而会生小兔子的兔子必须是三个月大,所以下月会生小兔子的兔子就是上月所有的兔子对数,因为上月无论是三个月大的兔子,两个月大的兔子,还是一个月大新生兔子都将会在下月成为能生小兔子的兔子。
例如:现在知道第四个月有3对兔子,如果想求出第五个月的兔子对数,就需要用第四个月的兔子对数的基础之上再加上在第五个月新生小兔子的对数,那么在第五个月新生小兔子的对数就等于第五个月会生小兔子的兔子对数(因为每对兔子只能生一对兔子),而第五个月会生小兔子的对数等于第三个月兔子的对数(因为第三个月的兔子无论几个月大,到第五个月都能生小兔子),所以 (第五个月兔子对数)=(第四个月兔子对数)+(第三个月兔子对数)。
程序实现:
class Program
{
static void Main(string[] args)
{
int i = 0; //循环次数
int m = 1; //某月兔子对数
int n = 1; //某月兔子对数
Console.WriteLine(m);
Console.WriteLine(n);
for (i = 0; i <= 4; i++)
{
m = m + n;
n = m + n;
Console.WriteLine(m);
Console.WriteLine(n);
}
Console.ReadKey();
}
}
每天一道算法题,享受思考~~