兔子问题
曾经读到兔子的问题,第一个月有一对兔子,每对兔子每个月生下一对兔子,兔子的一生只能生两对兔子,而后就over了(即上上个月新生的兔子在这个月生完兔子之后就死了)。然后问n个月之后共有几对兔子?
这个问题涉及的是斐波那契数列的递归函数。F(n) = f(n-1) + f(n-2);
一开始我感觉这个答案比较难以得出,所以我先推了一下:
第一个月:1对
第二个月:原来的1对+新生的1对=2对
第三个月:第二个月的2对+新生的2对-第一个月的1对=3对
第四个月:第三个月3对+新生的3对-第二个月的1对=5对
========》心算到这我发现规律是f(n) = 2f(n-1) - f(n-2):然后现在写出来发现不对,
因为第四个月的答案:f(4) = 2f(3) - f(2) = 2* 3 - 2 = 4 ;4<> 5;答案不对;所以继续推测:
第五个月:第四个月5对 + 新生的5对 - 第三个月新生的对数(2对)= 8对
========》发现规律f(n) = 2f(n-1) - f(n-2)的新生的兔子,即f(n) = 2f(n-1) - f(n-3)
第六个月:按照公式为16-3=13;和公式f(n-1) + f(n-2) = 5+8 = 13相等
第七个月:26-5=21;和公式f(n-1) + f(n-2) = 8+13 = 21相等
========》那么F(n) = f(n-1) + f(n-2)和f(n) = 2f(n-1) - f(n-3)是不是同一个等式呢?
先用代码测试一下:
static void Main(string[] args) { for (int i = 0; i < 30; i++) { long f1 = Fibonacci1(i); long f2 = Fibonacci2(i); Console.Write("第" + i + "代兔子:"); if (f1 == f2) { Console.WriteLine("相等为" + f1 + "对"); } else { Console.WriteLine("不相等;f1:" + f1 + "对;f2" + f2 + "对;"); } } Console.Read(); } static long Fibonacci1(int i) { if (i == 0 || i == 1) return 1; else return Fibonacci1(i - 1) + Fibonacci1(i - 2); } static long Fibonacci2(int i) { if (i == 0 || i == 1) return 1; else if (i == 2) return 2; else return 2 * Fibonacci2(i - 1) - Fibonacci2(i - 3); }

基本上可以证明F(n) = f(n-1) + f(n-2)和f(n) = 2f(n-1) - f(n-3)是同一个等式:
f(n)= f(n-1) + f(n-2);那么f(n-2) + f(n-3) = f(n-1) ;两式相加所得:f(n) + f(n-2) + f(n-3) = 2f(n-1) + f(n-2) ;
消元所得:f(n) = 2f(n-1) - f(n-3)
接下来换种思路:
可以知道第n个月的兔子组成部分:当月的新生兔子,当月成年兔子;
因为兔子的寿命是2个月,所以这个月不存在上上个月的兔子,只存在这个月新生的兔子和上个月新生的兔子,而上上个月新生的兔子在这个月生完兔子之后就死了。
结论1:当月新生兔子是有上个月n-1个月的所有兔子即f(n-1);
结论2:当月成年兔子即上个月新生的兔子,而由结论1可得:上个月新生的兔子即上上个所有的兔子,即f(n-2);
所以可得:f(n) = f(n-1) + f(n-2);

浙公网安备 33010602011771号