母牛生牛问题解析

关于母牛生牛的问题描述如下:

若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第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. }   
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值