基本描述如下:F(0) = 0,F(1)=1,F(n)= F(n-1)+F(n-2),求F(n).
采用递归的方法就不说了,很简单。递归是自上往下,有大量重复计算,如果我们采用自下往上的迭代方式,则会省去大量不必要计算,时间复杂度为O(n),代码如下:
int fibonacci(int n)
{ int FFirst = 1;
int FLast = 0;
int Sum = 0;
for (int i = 2;i<=n;i++)
{
Sum = FFirst+FLast;
FLast = FFirst;
FFirst = Sum;
}
return Sum;
}
网上看来第三种方法,时间复杂度是O(logn),详述如下:
由F(n) = F(n-1)+F(n-2)容易得到(F(n),F(n-1))= (F(n-1),F(n-2))*A,A = {1,1;1,0}继而推导出{f(n), f(n-1), f(n-1), f(n-2)} ={1, 1; 1,0}n-1 故求得A的n-1次方的矩阵,第一行第一列元素即为F(n),采用二分法来求解矩阵乘积:
/ an/2*an/2 n为偶数时
an=
\ a(n-1)/2*a(n-1)/2 *a n为奇数时
具体实现如下:
首先定义一个类或者Struct:2*2的矩阵Matrix,再定义两个矩阵成绩函数:Matrix matrixMulity(const Matrix& M1,const Matrix& M2),返回一个2*2的矩阵,具体代码不写了。然后是具体函数实现如下:
Matrix MatrixPower(unsigned int n)
{
Matrix matrix;
if(n == 1)
{
matrix = Matrix(1, 1, 1, 0);
}
else if(n % 2 == 0)
{
matrix = MatrixPower(n / 2);
matrix = MatrixMultiply(matrix, matrix);
}
else if(n % 2 == 1)
{
matrix = MatrixPower((n - 1) / 2);
matrix = MatrixMultiply(matrix, matrix);
matrix = MatrixMultiply(matrix, Matrix(1, 1, 1, 0));
}
return matrix;
}
long fibonacci(unsigned int n)
{
assert(n>=0);
const int F0 = 0;
const int F1 = 1;
if (n==1)
return F1;
if (n ==0)
return F0;
Matrix PowerNMinus2 = MatrixPower(n - 1);
return PowerNMinus2.M00;//这是矩阵的第一列第一行的元素
}