Home >Backend Development >PHP Tutorial >Seven ways to realize the general term of Fibonacci sequence

Seven ways to realize the general term of Fibonacci sequence

高洛峰
高洛峰Original
2017-01-14 16:41:341709browse

1: Recursive implementation
Use the formula f[n]=f[n-1]+f[n-2] and calculate recursively in sequence. The recursive end condition is f[1]=1, f[2] =1.
2: Array implementation
The space complexity and time complexity are both 0(n), the efficiency is average, and it is faster than recursion.
Three: VectorImplementation
The time complexity is 0(n), and the time complexity is 0(1). I just don’t know whether vector is efficient or not. Of course, vector has its own attributes that will occupy resources. .
Four: QueueImplementation
Of course, queues are more suitable for implementing Fibonacci sequences than arrays. The time complexity and space complexity are the same as vector, but queues are perfect for this,
f(n)=f(n-1)+f(n-2), f(n) is only related to f(n-1) and f(n-2), after f(n) enters the queue, f( n-2) can be dequeued.
5: Iterative implementation
Iterative implementation is the most efficient, with time complexity of 0(n) and space complexity of 0(1).
6: Formula Implementation
When I was searching Baidu, I found that the Fibonacci sequence has a formula, so it can be calculated using the formula.
Since the accuracy of the double type is not enough, the results calculated by the program will have errors. If the formula is expanded and calculated, the result will be correct.
The complete implementation code is as follows:

#include "iostream"
#include "queue"
#include "cmath"
using namespace std;
int fib1(int index)     //递归实现
{
 if(index<1)
 {
  return -1;
 }
 if(index==1 || index==2)
  return 1;
 return fib1(index-1)+fib1(index-2);
}
int fib2(int index)     //数组实现
{
 if(index<1)
 {
  return -1;
 }
 if(index<3)
 {
  return 1;
 }
 int *a=new int[index];
 a[0]=a[1]=1;
 for(int i=2;i<index;i++)
  a[i]=a[i-1]+a[i-2];
 int m=a[index-1];
 delete a;         //释放内存空间
 return m;
}
int fib3(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);
} 
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();
}
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;
}
int fib6(int n)
{
 double gh5=sqrt((double)5);
 return (pow((1+gh5),n)-pow((1-gh5),n))/(pow((double)2,n)*gh5);
} 
int main(void)
{
 printf("%d\n",fib3(6));
 system("pause");
 return 0;
}

Seven: Bipartite Matrix Method

Seven ways to realize the general term of Fibonacci sequence

##As shown above, any item in the Fibonacci sequence can be calculated using matrix powers , and nth power can be calculated in logn time.

The code is posted below:

void multiply(int c[2][2],int a[2][2],int b[2][2],int mod)
{
 int tmp[4];
 tmp[0]=a[0][0]*b[0][0]+a[0][1]*b[1][0];
 tmp[1]=a[0][0]*b[0][1]+a[0][1]*b[1][1];
 tmp[2]=a[1][0]*b[0][0]+a[1][1]*b[1][0];
 tmp[3]=a[1][0]*b[0][1]+a[1][1]*b[1][1];
 c[0][0]=tmp[0]%mod;
 c[0][1]=tmp[1]%mod;
 c[1][0]=tmp[2]%mod;
 c[1][1]=tmp[3]%mod;
}//计算矩阵乘法,c=a*b
int fibonacci(int n,int mod)//mod表示数字太大时需要模的数
{
 if(n==0)return 0;
 else if(n<=2)return 1;//这里表示第0项为0,第1,2项为1
 int a[2][2]={{1,1},{1,0}};
 int result[2][2]={{1,0},{0,1}};//初始化为单位矩阵
 int s;
 n-=2;
 while(n>0)
 {
  if(n%2 == 1)
   multiply(result,result,a,mod);
  multiply(a,a,a,mod);
  n /= 2;
 }//二分法求矩阵幂
 s=(result[0][0]+result[0][1])%mod;//结果
 return s;
}

The attached code is posted to calculate the nth power function of a using the bisection method.

int pow(int a,int n)
{
 int ans=1;
 while(n)
 {
  if(n&1)
   ans*=a;
  a*=a;
  n>>=1;
 }
 return ans;
}

For more related articles on seven ways to achieve the general terms of the Fibonacci sequence, please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn