牛生牛/兔子生兔子问题

牛生牛/兔子生兔子问题

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。编程实现在第n年的时候,共有多少头母牛?

本文章,详细阐述了本人第一次遇到这种问题的思路,和刷了相关题之后的思路。
首先阐述了第一次遇到这种问题的思路。
详细如下:

首先分析问题:面对这样的繁殖问题,可以考虑递推;个人第一次面对这种问题时的思路过程:

1.明确我的目标我要求第N年,那么如果我要求第100年怎么办?
我发现,我很难算出第100年的情况。
2. 那我退而求其次,在纸上列出表格,看能不能找出什么规律。

第零年第一年第二年第三年第四年第五年第六年
12346913

找规律,假如能找出一个数学公式的话,问题就容易解决了。
分析表格:前四年都是开始的母牛生下的孩子。从第四年开始,第一年出生的牛也开始生下孩子。写出分解运算,联想之前接触过的一些数组。第四年的6会不会是第三年加上第二年呢?4+3为7,显然不合理。再分析,6=4+2。
这个时候,结合实际问题。牛可以分解为:已经存在的牛+这一年生育的牛。
那么已经存在的牛是第三年有的牛。问题解决了一半。
3. 这个时候需要分析,这一年生育的牛。根据一般规律。6=4+2;9=6+3;13=9+4;再结合题目中,牛在第三年成熟,不难发现,这一年生育的牛是三年前成熟的牛。
4. 我们得到了数列的单项公式。an=a(n-1)+a(n-3)
5. 接下来进行代码实现。大致如下:

/*有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,
每年年初也生一头小母牛。编程实现在第n年的时候,共有多少头母牛?

分析:类似于兔子生兔子的问题
牛的总数等于,前一年的牛+出生的牛(n-3);
递归过程中,子问题,n-1年的牛也为:前一年的牛+出生的牛(n-3)
					n-3年的牛也为:前一年的牛+出生的牛(n-3)
递归结束条件:n=4时,第一次有出生的牛成熟。因该为n等于1,2,3时的值
*/
#include<iostream>
using namespace std;
int F(int n) {
	if (n == 0) return 1; //第0年,初始牛为1
	else if (n == 1)  return 2; //第二年,母牛生了一个,
	else if (n == 2) return 3;
	else if (n == 3) return 4;
	/*或
	if(n<4) return n+1;
	*/
	/*
	if(n<0) return 1;
	if(n==0) return 1;
	*/
	else if (n >= 4) return F(n - 1) + F(n - 3); //牛的数目是,前一年的牛+生的牛。。。
}												 //生的牛的总数是,三年前的牛的数目。  因为牛第四年才能生育		
int main() {
	int F(int n);
	int N;
	cout << "几年,小兄弟" << endl;
	cin >> N;
	cout << F(N);
}

总结一下这种题目的思路:

  1. 这种题目做多以后,再做,不由自主的会想起递归。
  2. 想到递归,就要分解出来第N年的数目(这里不妨假设N超过递归的结束条件),可以想一个具体的数字。
  3. 写F(N)=F();的公式。这一类问题,N年的数目,分两类,一个是N-1年的牛的数目,这个数目是已经存在的牛。还有F(N-3)的牛,这个数目是生育出来的牛(牛一年只能生育一只小牛,所以数目与F(N-3)相同。 PS:大家可以试一下如果一头牛可以生两只,或者更多的情况。或者每一年会死某个数目的牛)。
  4. 由此可得递归公式F(N)=F(N-1)+F(N-3)。
    接下来就是代码的实现。

下面放上代码的图片。
代码图片
之后会详细记录学习C++、数据结构、算法设计与分析过程中刷到的题目和感悟。仅供自己学习使用,如果恰好这篇文章能帮到你,不甚荣幸,需要代码的自行拿走,写错的请多多包容,共同学习,共同进步。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值