1. 程式人生 > >兔子生崽問題

兔子生崽問題

題目內容

假設一對小兔的成熟期是一個月,即一個月可長成成兔,那麼如果每對成兔每個月都可以生一對小兔,一對新生的小兔從第二個月起就開始生兔子,試問從一對兔子開始繁殖,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; }