首页 > 其他 > 详细

关于生兔子问题的思考

时间:2020-03-14 20:03:52      阅读:61      评论:0      收藏:0      [点我收藏+]

昨日再次看到C语言经典例题生兔子问题,问题描述:现有一对兔子,出生后从第三个月开始每个月都会生一对兔子,新生的兔子三个月后也会开始生一对兔子,问XX个月后会有多少对兔子??

我发现网上大多数解法都是根据其每月数量规律(即 费布拉契 数列)直接输出,

此时我思考如果将生长周期改为4个月还会是同样的规律吗??显然不是,因此我思考做一个求解此类问题的统一算法,主要的思想是使用递归解决

通过分析,我们得到的不确定值有四个:

1:初始兔子的对数

2:生长周期

3:生育间隔期

4:求解答的时间

 

因此封装如下函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//star_number:初始兔子对数 ,mature_year:生长周期 ,birth_interval:生育间隔时间, years:求解年份
long long function(int star_number,int mature_year,int birth_interval,int years){
    if(years <mature_year) return star_number;
    else{
        long long myson = 0;
        for(int i=mature_year;i<=years;i+=birth_interval){
            myson += function(star_number,mature_year,birth_interval,years-i);
        }
        return myson+star_number;
    }
}
  
int main(){
    for(int i = 1;i<=15;i++){
        printf("%lld ",function(1,3-1,1,i-1));
    }
    return 0;
}

  

可以看到算法使用的是递归求解,递归条件是有时间发育成熟并产生后代,否则返回自己,递归变量是年份,用通俗的话来说:

我们将最开始的兔子称为母体,母体不关心自己的间接后代,而是只关心自己的直接后代有多少,间接后代的数量是由直接后代决定,而每一个直接后代我们又可以看做一个母体,唯一的变化是剩余的繁殖时间有多少,因此这是一个典型的递归问题。

关于生兔子问题的思考

原文:https://www.cnblogs.com/zhaozezhongBlog/p/12493489.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!