古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
思路:先求出每個月新增的兔子,再用循環求和即可算出這個月總的兔子數。
月份 新增加兔子
1 1
2 0
3 1
4 1
5 1 + 1
6 1 + 1 + 1
7 (1 + 1 + 1)6月份新增的兔子 + (1 + 1)5月份新增的兔子
... ...
n n - 1月份新增的兔子 + n - 2月份新增的兔子
解法核心:每個月的新增的兔子都在下下個月以及以后的每個月生下一對新兔子,這對新兔子在下下個月以及以后的每個月都會生下一對新兔子,以此規律循環。
因此,只要上個月有新增的兔子后,這個月都會新增和上個月新兔子數量同樣的兔子,同時還會新增上上個月兔子數量的新兔子。這兩個數量相加就得到這個月一共新增加的兔子。
用遞歸的方法求出每個月新增的兔子(自定義函數):
static int NewRabbitOfMonth(int n)
{
if(n == 1)
{
return 1;
}
else if(n == 2)
{
return 0;
}
else
{
return NewRabbitOfMonth(n - 1) + NewRabbitOfMonth(n - 2);
}
}
用循環求和的方法求出每個月的兔子總數(主函數):
static void Main(string[] args)
{
Console.Write("請輸入第幾個月:");
int n = int.Parse(Console.ReadLine());
int sumRabbitOfMonth = 0;
for(int i =1; i <= n; i++)
{
sumRabbitOfMonth += NewRabbitOfMonth(i);
}
Console.Write("第" + n + "個月共有" + sumRabbitOfMonth + "對兔子");
Console.ReadLine();
}
思考:
每個月新增的兔子數量實際上是一個斐波拉契數列:
1,0,1,1,2,3,5...
每個月總的兔子數量也是一個斐波拉契數列:
1,1,2,3,5,8,13...
下面個數列每一項減去上面個數量每一項得到的新數列也是斐波拉契數列:
0,1,1,2,3,5,8...
結論:
一個斐波拉契數量的每一項減去另一個斐波拉契數列的對應每一項得到的新數列也是斐波拉契數列。(待驗證)
