分享一个之前写的练习题——斐波那契数列(兔子出生)
先看一下题目:
        super 家养了一对刚出生的兔子, 兔子出生第 3 月开始每月都会生一对小兔子, 小兔子出生后同样第 3 月开始也会每月生一对兔子,
super 想知道 如果兔子不死 n 月后家里会有多少对兔子。设计一个程序: 要求输入 n, 输出兔子数量。(2<n<30)
        样例输入: 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;
}
好了,那么这题就到这了,下次见,拜拜!