您的位置:首页 > 其它

fibonacci数列(五种)

2015-11-30 20:59 169 查看
自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm

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

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

代码:

int fib(int n)     //递归实现
{
if(n<1)
{
return -1;
}
if(n==1 || n==2)
return 1;
return fib1(n-1)+fib1(n-2);
}


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

int a[1000];
int fib(int n)     //数组实现
{
if(n<1)
{
return -1;
}
if(n<3)
{
return 1;
}
a[1]=a[2]=1;
for(int i=2;i<=n;i++)
a[i]=a[i-1]+a[i-2];
return a
;
}


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

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

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


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)就可以出队列了。
代码:

int fib4(int index)       //队列实现
{
if(index<1)
{
return -1;
}
queue<int>q;
q.push(1);
q.push(1);
for(int i=2;i<index;i++)
{
q.push(q.front()+q.back());
q.pop();
}
return q.back();
}


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

int fib5(int n)          //迭代实现
{
int i,a=1,b=1,c=1;
if(n<1)
{
return -1;
}
for(i=2;i<n;i++)
{
c=a+b;     //辗转相加法(类似于求最大公约数的辗转相除法)
a=b;
b=c;
}
return c;
}


fibonacci的写法真的太多了,c或者c++都可以有很多不同的方式,小白只需要知道最简单易懂的就好了,心塞塞.....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: