问题示例:
题目描述
这是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。按此规律,假设没有兔子死亡,第一个月有一对刚出生的小兔子,问第n个月有多少对兔子?
输入
输入月数n(1<=n<=44)。
输出
输出第n个月有多少对兔子。
补充:(补充前7条示例)
输入 | 输出 |
1 | 1 |
2 | 1 |
3 | 2 |
4 | 3 |
5 | 5 |
6 | 8 |
7 | 13 |
代码实现:
#include<iostream>
using namespace std;
#include<math.h>
int first(int &phase1,int &phase2,int &could_birth)
{
phase1=phase1;
}
int second(int &phase1,int &phase2,int &could_birth)
{
first(phase1,phase2,could_birth);
phase2=phase1;
phase1=0;
}
int third(int &phase1,int &phase2,int &could_birth)
{
second(phase1,phase2,could_birth);
could_birth=could_birth+phase2;
phase2=0;
phase1=phase1+could_birth;
}
int common(int n,int &phase1,int &phase2,int &could_birth)
{
third(phase1,phase2,could_birth);
n=n-3;
for(int i=1;i<=n;i++)
{
could_birth=could_birth+phase2;
phase2=phase1;
phase1=could_birth;
}
}
int main()
{
int n;
cin>>n;
int phase1=1;
int phase2=0;
int could_birth=0;
int amount;
if(n==1)
{
first(phase1,phase2,could_birth);
}
else if(n==2)
{
second(phase1,phase2,could_birth);
}
else if(n==3)
{
third(phase1,phase2,could_birth);
}
else{
common(n,phase1,phase2,could_birth);
}
amount=phase1+phase2+could_birth;
cout<<"phase1="<<phase1<<endl;
cout<<"phase2="<<phase2<<endl;
cout<<"could_birth="<<could_birth<<endl;
cout<<"amount="<<amount<<endl;
}
代码剖析:
核心思想就是2年发育,第三年生,我们调用的时候需要用到递归思想,因为第三年的数量需要依赖于第二年的数量,第二年的数量也是在第一年的基础上才有的。
其中:
phase1:代表发育的第一年的小兔子的数量
phase2:代表发育的第二年的小兔子的数量
could_birth:代表可以生育的成人兔子的数量
(1)第一年的数量计算
int first(int &phase1,int &phase2,int &could_birth)
{
phase1=phase1;
}
(2)第二年的数量计算
int second(int &phase1,int &phase2,int &could_birth)
{
first(phase1,phase2,could_birth);
phase2=phase1;
phase1=0;
}
(3)第三年的数量计算
int third(int &phase1,int &phase2,int &could_birth)
{
second(phase1,phase2,could_birth);
could_birth=could_birth+phase2;
phase2=0;
phase1=phase1+could_birth;
}
(3)超过3年的数量计算
int common(int n,int &phase1,int &phase2,int &could_birth)
{
third(phase1,phase2,could_birth);
n=n-3;
for(int i=1;i<=n;i++)
{
could_birth=could_birth+phase2;
phase2=phase1;
phase1=could_birth;
}
}