1. 直接计算(递归)
int fib(int x)
{
if (x <= 1)
return x;
return fib(x-1)+fib(x-2);
}时间复杂度: O(2^n)
2. 使用动态规划:
int fib(int n)
{
if( n == 0 || n == 1)
{
return n;
}
int a = 0, b = 1,i;
for (i = 2; i <= n;i++)
{
int c = a + b;
a = b;
b = c;
}
return b;
}时间复杂度: O(n)
3. 使用矩阵幂
unsigned long long fibnacci(int n)
{
unsigned long long fib[2][2] = {{1, 1}, {1, 0}};
unsigned long long result[2][2] = {{1, 0}, {0, 1}};
unsigned long long tmp[2][2];
while(n > 0 )
{
if( n & 1)
{
int i,j,k;
memset(tmp, 0, sizeof(tmp));
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
int k;
for(k = 0; k < 2; k++)
{
tmp[i][j] += result[i][k] * fib[k][j];
}
}
}
memcpy(result, tmp, sizeof(result));
}
int i, j, k;
memset(tmp, 0, sizeof(tmp));
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
int k;
for(k = 0; k < 2; k++)
{
tmp[i][j] += fib[i][k] * fib[k][j];
}
}
}
memcpy(fib, tmp, sizeof(tmp));
n = n >> 1;
}
return result[0][1];
} 时间复杂度: O(Logn)