[zz]母牛生牛问题解析

http://blog.csdn.net/lirincy/archive/2008/09/17/2944195.aspx

若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年有多少头母牛?
由于这道题出现 在钱能的C++书籍当中,因此关于这道题的讨论有很多:

http://topic.csdn.net/t/20031207/17/2537255.html

http://ks.cn.yahoo.com/question/1407041505424.html

但是很多论述和解答都不太正确,我综合了一下各方的方案,经过推导,给出如下解答:

对于母牛的数量,有如下数量关系:

时间(年)     1岁牛(头)     2岁牛(头)     3岁牛(头)     4岁以及以上(头)      母牛总数(头)
1             1     0             0                    0                                 1  
2            0     1             0                    0                                 1  
3            0     0             1                    0                                 1  
4            1     0             0                    1                                 2 
5             1     1             0                    1                                 3 
6             1     1              1                    1                                 4  
7             2     1              1                    2                                 6  
8             3     2             1                    3                                 9 
9            4     3              2                    4                                 13  
10              6     4              3                    6                                 19  
设 第N年的年龄为1的母牛为T1(N)只,依次,年龄为2、3以及4或以上的牛的个数分别为T2(N)、T3(N)、T4(N).

对于T(N+1), 有如下关系(具体逻辑很容易推导,请自行完成):

T1(N+1)=T3(N)+T4(N);

T2(N+1)=T1(N);

T3(N+1)=T2(N);

T4(N+1)=T3(N)+T4(N);

设F(N) 代表第N天的母牛,则有:

F(N) = T1(N)+T2(N)+T3(N)+T4(N)

         = T3(N-1)+T4(N-1)+T1(N-1)+T2(N-1)+T3(N-1)+T4(N-1)

         = F(N-1) + T3(N-1)+T4(N-1)

         = F(N-1) + T2(N-2)+T3(N-2)+T4(N-2)

         = F(N-1) + T1(N-3)+T2(N-3)+T3(N-3)+T4(N-3)

         = F(N-1) + F(N-3)

因此,如下的递归解法是正确的:

  1. int   GetCount(int   age)   
  2. {   
  3.         if(age==0)   
  4.         {     
  5.                return 0;   
  6.         }   
  7.         else   
  8.         {   
  9.                if(age<4)   
  10.                {       
  11.                      return 1;   
  12.                }   
  13.     
  14.                return (GetCount(age-1)+GetCount(age-3));   
  15.          }   
  16. }  

posted @ 2011-01-23 21:36  bettermanlu  阅读(404)  评论(0编辑  收藏  举报