程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話求Fibonacci斐波那契數列通項成績的解法總結

C說話求Fibonacci斐波那契數列通項成績的解法總結

編輯:關於C++

C說話求Fibonacci斐波那契數列通項成績的解法總結。本站提示廣大學習愛好者:(C說話求Fibonacci斐波那契數列通項成績的解法總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話求Fibonacci斐波那契數列通項成績的解法總結正文


一:遞歸完成
   應用公式f[n]=f[n-1]+f[n-2],順次遞歸盤算,遞歸停止前提是f[1]=1,f[2]=1。

二:數組完成
   空間龐雜度和時光龐雜度都是0(n),效力普通,比遞歸來得快。

三:vector<int>完成
   時光龐雜度是0(n),時光龐雜度是0(1),就是不曉得vector的效力高不高,固然vector有本身的屬性會占用資本。

四: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)便可以出隊列了。

五:迭代完成
   迭代完成是最高效的,時光龐雜度是0(n),空間龐雜度是0(1)。

六:公式完成
百度的時刻,發明本來斐波那契數列有公式的,所以可使用公式來盤算的。

因為double類型的精度還不敷,所以法式算出來的成果會有誤差,假如把公式睜開盤算,得出的成果就是准確的。

完全的完成代碼以下:

#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; 
} 

七:二分矩陣辦法

如上圖,Fibonacci 數列中任何一項可以用矩陣冪算出,而n次冪是可以在logn的時光內算出的。
上面貼出代碼:

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; 
} 

附帶的再貼上二分法盤算a的n次方函數。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved