zoukankan      html  css  js  c++  java
  • 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++都可以有很多不同的方式,小白只需要知道最简单易懂的就好了,心塞塞.....

  • 相关阅读:
    700. Search in a Binary Search Tree
    100. Same Tree
    543. Diameter of Binary Tree
    257. Binary Tree Paths
    572. Subtree of Another Tree
    226. Invert Binary Tree
    104. Maximum Depth of Binary Tree
    1、解决sublime打开文档,出现中文乱码问题
    移植seetafaceengine-master、opencv到ARM板
    ubuntu16.04-交叉编译-SeetaFaceEngine-master
  • 原文地址:https://www.cnblogs.com/yinqx/p/5008377.html
Copyright © 2011-2022 走看看