演算法入門:斐波那契數列和演算法的時間複雜度
阿新 • • 發佈:2019-01-28
此處使用三種方式實現斐波那契數列:遞迴、遞推和通項公式。
實現過程如下:
#include<cstring> #include<cstdio> #include<iostream> #include<cmath> using namespace std; // 遞迴 int recurrence1(int n) { if(n==0||n==1) return n; else return recurrence1(n-1)+recurrence1(n-2); } // 遞推 int recurrence2(int n) { int a[10000]; a[0]=0; a[1]=1; if(n==0||n==1) return a[n]; else { for(int i=2; i<=n; i++) a[i]=a[i-1]+a[i-2]; return a[n]; } } // 通項公式(得到的值都是整數) /** pow函式原型: double pow ( double base, double exponent ); long double pow ( long double base, long double exponent ); float pow ( float base, float exponent ); double pow ( double base, int exponent ); long double pow ( long double base, int exponent ); sqrt函式原型: double sqrt ( double x ); float sqrt ( float x ); long double sqrt ( long double x ); */ int getGeneralTermFormula(int n) { double a1=pow((1+sqrt(5))/2,n); double a2=pow((1-sqrt(5))/2,n); double ans=(a1-a2)/sqrt(5); return ans; } int main() { int n; while(~scanf("%d",&n)) { int ans1,ans2,ans3; ans1=recurrence1(n); ans2=recurrence2(n); ans3=getGeneralTermFormula(n); printf("遞迴:%d\n遞推:%d\n通項公式:%d\n",ans1,ans2,ans3); } return 0; }
時間複雜度:
遞迴:O()
因為每一個數都要通過遞迴求到a[0]或a[1]
遞推:O(n)
通項公式:O(1)