递归方式c语言计算幂级级数,计算fibnacci 级数的几种方法

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. 使用矩阵幂

0818b9ca8b590ca3270a3433284dd417.png

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值