兔子产子问题

Posted bzsc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了兔子产子问题相关的知识,希望对你有一定的参考价值。

一、问题描述:

二、设计思路:

 遇到这种兔子不死的爆发户问题,先不要慌,列个表先

 通过这个表可以清楚知道兔子总数随月份变化的规律依次为1,1,2,3,5,8,13......很明显是斐波那契(Fibonacci)数列,对了忘了介绍,小兔子代表出生了1个月的兔子,中兔子代表出生2个月的兔子,老兔子代表出生3个月以上的兔子,此题的切入点转化为从斐波那契入手,用迭代的思想反映出来。

 跌代的思想主要在于初值和迭代公式,现在思路已经很清晰了。

三、程序流程图:

 

四、代码实现:

#include<stdio.h>
int main()

    long fb1=1;//表示前一个月的兔子数量
    long fb2=1;//表示前两个月的兔子数量
    long fb;//表示当前月份的兔子数量
    printf("%12ld%12ld",fb1,fb2);//输出第一月和第二月的兔子数量
    for(int i=3;i<=30;i++)
    
        fb=fb1+fb2;//当前月份的兔子数量=前面一个月+前面两个月
        printf("%12ld",fb);
        if(i%4==0)//这里起到一个格式作用
        
        printf("\\n");//每行输出四个
        
        fb2=fb1;//把前一个月的兔子数量赋给前两个月,实现月份的后移
        fb1=fb;//把当月的兔子数量赋给前一个月,实现月份的后移
        
    
    return 0;

 我们还可以稍微改进一下,只用两个变量来表示

#include<stdio.h>
int main()

    long fb1=1;//表示前一个月的兔子数量
    long fb2=1;//表示前两个月的兔子数量
    for(int i=1;i<=15;i++)//循改进减少一半
    
        printf("%12ld%12ld",fb1,fb2);
        if(i%2==0)//这里起到一个格式作用
        
            printf("\\n");//每行输出2个
        
        fb1=fb1+fb2;//直接表示最新一个月的兔子数量
        fb2=fb1+fb2;//直接表示比fb1还新一个月的兔子数量
        
    
    return 0;

 时间缩短了一点有木有?我们平时就应该精炼算法,以后拿到工程可以尽可能的提高效率,跌代的思想比较难掌握,关键在于初值和迭代公式,怎样才能套娃套起来,然后思考什么时候我停止套娃,也就是迭代的终止条件,稍有不慎就会出现死循环,继续坚持学习,人类的赞歌就是勇气的赞歌。

 

兔子产子

从前有一对长寿的兔子,他们每一个月生出一对小兔子。第一个月新生产的兔子两个月就长大了,在第三个月初開始生他们的下一代小兔子,这样一代一代的生下去,不考虑兔子的寿命,求第n个月出生多少对小兔子 

 

简单演示样例:

比方输入1,第一个月出生的兔子仅仅有一对。所以输出为1

比方输入2,第二个月出生的兔子仅仅有一对。所以输出为1

比方输出为3。则该月份有两对兔子出生,则输出为2

 

要求:

 

实现下面接口:

输入一个正整数。表示第几个月,输出该月份生产出的小兔子的对数

调用者会保证: 

输入的月份与生产的兔子数目都为unsigned int 能表达的数字 


斐波纳契数列原型问题.


unsigned int GetBirthRabbitNum(unsigned int  nValue1)
{
	if(nValue1==1||nValue1==2)
		return 1;
	if(nValue1>2)
		return GetBirthRabbitNum(nValue1-1)+GetBirthRabbitNum(nValue1-2);
}


以上是关于兔子产子问题的主要内容,如果未能解决你的问题,请参考以下文章

兔子产子问题

Python趣味算法学习笔记------兔子产子(不死神兔)

兔子产子

1.5 兔子产子问题

C语言每日一练——第147天:兔子产子问题

兔子产子