您的位置:首页 > 其它

计算fibnacci 级数的几种方法

2016-04-15 08:16 393 查看
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: