您的位置:首页 > 产品设计 > UI/UE

【算法详解】斐波那契数列 - Fibonacci sequence

2014-02-16 13:25 381 查看

1. 斐波那契数列定义



在线测试工具http://zh.numberempire.com/fibonaccinumbers.php

2. 算法

求解斐波那契数列的第n个数:

2.1 递归/分治法

#include <cstring>
#include <iostream>

using namespace std;

unsigned long fabinacci(unsigned int n)
{
if (n == 0)
{
return 0;
}else
if (n == 1)
{
return 1;
}else
{
return fabinacci(n - 2) + fabinacci(n - 1);
}
}

int main()
{
unsigned int n = 0;
cout<<"Please input a unsigned integer:"<<endl;
cin>>n;
cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
return 0;
}


递归效率分析:

以计算f(10)为例:



从图中可以看出:要计算很多重复的之,计算重复值的数量随着N值而急剧增大。事实上该算法的时间复杂度随着n值呈指数增长 O((3/2)^n)

2.2 迭代求解

循环求解:
#include <cstring>
#include <iostream>

using namespace std;

long long fabinacci(unsigned int n)
{
if (n == 0)
{
return 0;
}else
if (n == 1)
{
return 1;
}

long long first = 0;
long long second = 1;

for (unsigned i = 1; i < n; i++)
{
second = first + second;
first = second - first;
}

return second;
}

int main()
{
unsigned int n = 0;
cout<<"Please input a unsigned integer:"<<endl;
cin>>n;
cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
return 0;
}


时间复杂度为:O(n)

2.3 通向求解



2.4 矩阵乘法 / 分治策略

推导:

#include <cstring>
#include <iostream>

using namespace std;

void MatrixMulti(long long matrix[2][2],long long matrix2[2][2])
{
long long a = matrix[0][0] * matrix2[0][0] +  matrix[0][1] * matrix2[1][0];
long long b = matrix[0][0] * matrix2[0][1] +  matrix[0][1] * matrix2[1][1];
long long c = matrix[1][0] * matrix2[0][0] +  matrix[1][1] * matrix2[1][0];
long long d = matrix[1][0] * matrix2[0][1] +  matrix[1][1] * matrix2[1][1];
matrix[0][0] = a;
matrix[0][1] = b;
matrix[1][0] = c;
matrix[1][1] = d;
}

long long fabinacci(int value)
{
if(value == 0)
{
return 0;
}

long long A[2][2] = {1,1,1,0};
long long Matrix[2][2] = {1,0,1,0};

int n = value - 1;

for(; n ;n >>= 1)
{
//odd
if(n&1)
{
MatrixMulti(Matrix,A);
}
MatrixMulti(A,A);
}

return Matrix[0][0];
}

int main()
{
unsigned int n = 0;
cout<<"Please input a unsigned integer:"<<endl;
cin>>n;
cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n);
return 0;
}


时间复杂度:O(log(N))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: