兔子生崽问题

题目内容

假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,n(n<=12)月以后可有多少对兔子(即当年第n月份总计有多少对兔子,含成兔和小兔)?请编程求解该问题,n的值要求从键盘输入。

参考答案:依题意,兔子的繁殖情况如图所示。图中实线表示成兔仍是成兔或者小兔长成成兔;虚线表示成兔生小兔。观察分析此图可发现如下规律:

(1)每月小兔对数 = 上个月成兔对数。

(2)每月成兔对数 = 上个月成兔对数 + 上个月小兔对数。

综合(1)和(2)有:每月成兔对数 = 前两个月成兔对数之和。

用fn(n=1,2,…)表示第n个月成兔对数,于是可将上述规律表示为如下递推公式:

程序运行示例

Input n(n<=12):

10↙

1 2 3 5 8 13 21 34 55 89

Total=89

输入提示:“Input n(n<=12):\n”

输入格式:"%d"

输出格式

每个月兔子对数的输出格式: “%4d”

第12个月的兔子总数的输出格式: “\nTotal=%d\n”

#include<stdio.h>
int H(int n);
int main()
{
  int a[20],b[20];
  int i,n,total=0;
  printf("Input n(n<=12):\n");
  scanf("%d",&n);
  for(i=1;i<=n;i++)
  {
    a[i]=H(i);                                 
	b[i]=H(i+1);
  }
  for(i=1;i<=n;i++)
  {
    printf("%4d",a[i]+b[i]);
  }
  printf( "\nTotal=%d\n",a[n]+b[n]);

}

int H(int n)                     //这个函数功能是求成兔对数,求第n月小兔数即为H(n-1)
{
  int a;  
  if(n==1)
	return 0;
  else if(n==2)
	return 1;
  else 
    a=H(n-1)+H(n-2);            //典型的递归求法,和Fabonacci数列写法近乎相同
  return a;
}

猜你喜欢

转载自blog.csdn.net/qq_43535204/article/details/85207551
今日推荐