• fibonacci数列(五种)


     自己没动脑子,大部分内容转自http://www.jb51.net/article/37286.htm

    斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说。

    1.递归公式:f[n]=f[n-1]+f[n-2],f[1]=f[2]=1;(比较耗时,效率不高)

    代码:

     1 int fib(int n)     //递归实现
     2 {
     3  if(n<1)
     4  {
     5   return -1;
     6  }
     7  if(n==1 || n==2)
     8   return 1;
     9  return fib1(n-1)+fib1(n-2);
    10 }

    2.数组实现:空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快。
    代码:

     1 int a[1000];
     2 int fib(int n)     //数组实现
     3 {
     4  if(n<1)
     5  {
     6   return -1;
     7  }
     8  if(n<3)
     9  {
    10   return 1;
    11  }
    12  a[1]=a[2]=1;
    13  for(int i=2;i<=n;i++)
    14   a[i]=a[i-1]+a[i-2];        
    15  return a[n];
    16 }

    3.vector<int>实现:时间复杂度是0(n),时间复杂度是0(1),就是不知道vector的效率高不高,当然vector有自己的属性会占用资源。

    代码:(自己的vector依然一片茫然,只有照搬)

     1 int fib(int index)           //借用vector<int>实现
     2 {
     3  if(index<1)
     4  {
     5   return -1;
     6  }
     7  vector<int> a(2,1);      //创建一个含有2个元素都为1的向量
     8  a.reserve(3);
     9  for(int i=2;i<index;i++)
    10  {
    11   a.insert(a.begin(),a.at(0)+a.at(1));
    12   a.pop_back();
    13  }
    14  return a.at(0);
    15 } 

    4.queue<int>实现:当然队列比数组更适合实现斐波那契数列,时间复杂度和空间复杂度和vector<int>一样,但队列太适合这里了,
    f(n)=f(n-1)+f(n-2),f(n)只和f(n-1)和f(n-2)有关,f(n)入队列后,f(n-2)就可以出队列了。
    代码:

     1 int fib4(int index)       //队列实现
     2 {
     3  if(index<1)
     4  {
     5   return -1;
     6  }
     7  queue<int>q;
     8  q.push(1);
     9  q.push(1);
    10  for(int i=2;i<index;i++)
    11  {
    12   q.push(q.front()+q.back());
    13   q.pop();
    14  }
    15  return q.back();
    16 }

    5.迭代实现:迭代实现是最高效的,时间复杂度是0(n),空间复杂度是0(1)。
    代码:

     1 int fib5(int n)          //迭代实现
     2 {
     3  int i,a=1,b=1,c=1;
     4  if(n<1)
     5  {
     6   return -1;
     7  }
     8  for(i=2;i<n;i++)
     9  {
    10   c=a+b;     //辗转相加法(类似于求最大公约数的辗转相除法)
    11   a=b;
    12   b=c;
    13  }
    14  return c;
    15 }

    fibonacci的写法真的太多了,c或者c++都可以有很多不同的方式,小白只需要知道最简单易懂的就好了,心塞塞.....

  • 相关阅读:
    Git之常用的命令操作
    Linux之创建777权限的文件
    Mysql union
    读取MySQL数据表字段信息
    Linux下mysql启动失败
    TP5之使用layui分页样式
    使用Bootstrap实现表格列的显示与隐藏
    MySQL之避免插入重复数据
    Linux命令之清空当前文件
    opensns入门
  • 原文地址:https://www.cnblogs.com/yinqx/p/5008377.html
Copyright © 2020-2023  润新知