回覆列表
  • 1 # 變餅檔

    有一對兔子,從出生後第 3 個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?

    兔子的規律為數列:1, 1, 2, 3, 5, 8, 13, 21 ....

    下面使用了迭代、遞迴和陣列三種解法。

    【方法一】使用迭代:

    #include <stdio.h>

    int main()

    {

    long f1=1, f2=1; // 兔子的數量

    int i; // 迴圈次數

    int n; // 要計算的月份

    printf("輸入要計算的月數:");

    scanf("%d", &n);

    // 計算出迴圈次數

    if(n%2==1)

    {

    n = (n+1)/2;

    }else{

    n = n/2;

    }

    for(i=1;i<=n;i++)

    {

    printf("第%d個月有%d只n", i*2-1, f1);

    printf("第%d個月有%d只n", i*2, f2);

    f1=f1+f2; /*前兩個月加起來賦值給第三個月*/

    f2=f1+f2; /*前兩個月加起來賦值給第三個月*/

    }

    return 0;

    }

    執行結果:

    輸入要計算的月數:10

    第1個月有1只

    第2個月有1只

    第3個月有2只

    第4個月有3只

    第5個月有5只

    第6個月有8只

    第7個月有13只

    第8個月有21只

    第9個月有34只

    第10個月有55只

    【方法二】使用遞迴:

    #include<stdio.h>

    int Feibonacci(int n)

    {

    if(n==1||n==2)

    return 1;

    else

    return Feibonacci(n-1)+Feibonacci(n-2);

    }

    int main()

    {

    int n; // 要計算的月份

    printf("輸入要計算的月數:");

    scanf("%d", &n);

    printf("%d個月的兔子總數為%dn", n, Feibonacci(n));

    return 0;

    }

    執行結果:輸入要計算的月數:10

    10個月的兔子總數為55

    遞迴看上去非常符合邏輯,但是這種遞迴效率是非常慢的,不信你計算20, 30, 40 個月的兔子數試試,明顯比另外兩種方法慢多了!

    【方法三】使用陣列:

    #include<stdio.h>

    void main()

    {

    int a[100] ,i,n;

    printf("請輸入月數:");

    scanf("%d",&n);

    a[0]=a[1]=1;

    for(i=2;i<n;i++)

    a[i]=a[i-1]+a[i-2];

    printf("第%d個月的兔子為:%dn", n, a[n-1]);

    }

    執行結果:請輸入月數:10

    第10個月的兔子為:55

  • 中秋節和大豐收的關聯?
  • 怎麼訓練兩個月大的普通狗?