码迷,mamicode.com
首页 > 其他好文 > 详细

fibonacci数列(五种)

时间:2015-11-30 22:13:54      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:

 自己没动脑子,大部分内容转自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++都可以有很多不同的方式,小白只需要知道最简单易懂的就好了,心塞塞.....技术分享

fibonacci数列(五种)

标签:

原文地址:http://www.cnblogs.com/yinqx/p/5008377.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!