斐波那契数列

来源:互联网 发布:矢量数据特点 编辑:程序博客网 时间:2024/06/02 03:25

斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列、费波那西数列、费波拿契数、费氏数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。特别指出:0不是第一项,而是第零项。

递推公式

斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …

如果设F(n)为该数列的第n项(n∈N+)。那么这句话可以写成如下形式:

F(0) = F(1) = 1;F(n) = F(n-1) + F(n-2);

显然这是一个线性递推数列。
代码实现:

#include <iostream>using namespace std;long long Fibonacci(int n){    return n<2?n:Fibonaccil(n-1)+Fibonaccil(n-2);};int main(){    long long ret = Fibonaccil(10);    cout<<ret<<endl;    system("pause");    return 0;}

时间复杂度:O(2^N)
空间复杂度:O(N)
上述方法虽然能实现斐波那契数列的计算,但是计算过程会出现多次重复,导致运算速率大大降低。

斐波那契数列的优化1:

#include <iostream>using namespace std;long long Fibonacci(int n){    long long *fibArray = new long long[n+1];    fibArray[0] = 0;    fibArray[1] = 1;    for(int i=2; i<=n; ++i)    {        fibArray[i] = fibArray[i-1] + fibArray[i-2];    }    return fibArray;};int main(){    long long ret = Fibonacci(10);    cout<<ret<<endl;    system("pause");    return 0;}

时间复杂度:O(N)
减少了时间上的浪费

斐波那契数列的优化2:

#include <iostream>using namespace std;long long Fibonacci(int n){    long long fibArray[3] = {0, 1, n};    for(int i=2; i<=n; ++i)    {        fibArray[2] = fibArray[1] + fibArray[0];        fibArray[0] = fibArray [1];        fibArray[1] = fibArray[2];    }    return fibArray[2];};int main(){    long long ret = Fibonacci(10);    cout<<ret<<endl;    system("pause");    return 0;}

时间复杂度:O(N)
空间复杂度:O(1)
既减少了时间上的浪费,又减少了空间上的浪费

斐波那契数列的递归优化:

#include <iostream>using namespace std;long long Fibonacci(int first, int second, int n){    if(n == 3)    {        return first + second;    }    return Fibonacci(second, first+second, n-1);};int main(){    long long ret = Fibonacci(10);    cout<<ret<<endl;    system("pause");    return 0;}
1 0
原创粉丝点击