有一對兔子,從出生後第 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);
printf("%d個月的兔子總數為%dn", n, Feibonacci(n));
執行結果:輸入要計算的月數:10
10個月的兔子總數為55
遞迴看上去非常符合邏輯,但是這種遞迴效率是非常慢的,不信你計算20, 30, 40 個月的兔子數試試,明顯比另外兩種方法慢多了!
【方法三】使用陣列:
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
有一對兔子,從出生後第 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