兔子生崽問題
阿新 • • 發佈:2018-12-30
題目內容:
假設一對小兔的成熟期是一個月,即一個月可長成成兔,那麼如果每對成兔每個月都可以生一對小兔,一對新生的小兔從第二個月起就開始生兔子,試問從一對兔子開始繁殖,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;
}