兔子问题

曾经读到兔子的问题,第一个月有一对兔子,每对兔子每个月生下一对兔子,兔子的一生只能生两对兔子,而后就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);

posted @ 2016-12-06 17:49  江境纣州  阅读(80)  评论(0)    收藏  举报