分享一个之前写的练习题——斐波那契数列(兔子出生)
先看一下题目:
super 家养了一对刚出生的兔子, 兔子出生第 3 月开始每月都会生一对小兔子, 小兔子出生后同样第 3 月开始也会每月生一对兔子,
super 想知道 如果兔子不死 n 月后家里会有多少对兔子。设计一个程序: 要求输入 n, 输出兔子数量。(2<n<30)
样例输入: 7
样例输出:13
样例输入: 12
样例输出: 144
我先画一下重点:1.第 3 月开始每月都会生一对小兔子;2.同样第 3 月开始也会每月生一对兔子;3. n 月;
样例输入: 7
样例输出:13
样例输入: 12
样例输出: 144
我先画一下重点:1.第 3 月开始每月都会生一对小兔子;2.同样第 3 月开始也会每月生一对兔子;3. n 月;
再写代码之前我们可以先想一想一个知识点
即:
兔子的繁殖模式与斐波那契数列完全一致,每个月的兔子对数等于前两个月兔子对数之和。什么意思呢?
可以先设一个函数f(n),
要知道2个月前(含2个月)就已经是一对兔子了!
所以:
当n=1,n=2时,有f(1) = 1,f(2) = 1;
那f(3)是不是就等于f(1) + f(2),所以我可以依旧同理所得:
f(4) = f(3) + f(2);
f(5) = f(4) + f(3);
f(6) = f(5) + f(4);
f(7) = f(6) + f(5);
and so on.......
发现了吗有规律啊!什么呢?
即:f(n) = f(n-1) + f(n-2);
好了下面我们再看看如何再函数里实现?
int num(int x);定义一个int类型的函数num,括号里的形参x,将对应主函数里的实参n.
int main(){ int n; cin>>n; }如果n<3,那么可以直接在主函数中写条件:
if(n<3) cout<<1<<endl;之后,我用一个for循环来实现n 月后家里会有多少对兔子。
for(i=3;i<=x;++i){ number = f1 + f2; f2 = f1; f1 = number; }
number = f1 + f2;这个对应f(3) = f(1) + f(2);
那么怎样去理解这两行代码:
f2 = f1; f1 = number;
f(4) = f(3) + f(2);
f(5) = f(4) + f(3);
f(6) = f(5) + f(4);
f(7) = f(6) + f(5);
先把f(3)当作f(1),f(2)当作f(2),呵呵这个式子f(4) = f(3) + f(2);
那么f(5)中的f(3)是不是f(4)中的f(1)(即:f(3)),同理:f(6)中的f(4)是不是f(5)中的f(1)(即:f(4)),f(7)中的f(5)是不是f(6)中的f(1)(即:f(5)),哈哈,如此说来
我们就可以发现并写出f2 = f1;

那么还是这些式子:
f(4) = f(3) + f(2) = f(4) = number;
f(5) = f(4) + f(3) = f(5) = number;
f(6) = f(5) + f(4) = f(6) = number;
f(7) = f(6) + f(5) = f(7) = number;
f(8) = f(7) + f(6) = f(8) = number;
and so on.......
我用彩色一标,是不是很清楚看到:
number -> f(4);
number -> f(5);
number -> f(6);
number -> f(7),andso on.......;
所以得出:f1 = number;
好了我们就可以写出代码了:
#include<iostream> using namespace std; int num(int x){ int f1=1,f2=1; int number = 0; int i; for(i=3;i<=x;++i){ number = f1 + f2; f2 = f1; f1 = number; } return number; } int main(){ int n; cin>>n; if(n<3) cout<<1<<endl; else{ int num_1 = 0; num_1 = num(n); cout<<num_1<<endl; } return 0; }好了,那么这题就到这了,下次见,拜拜!
