斐波那契数列算法优化

斐波那契数列算法优化

最早研究这个数列的是斐波那契,他当时为了描述如下情况的兔子生长数目:
* 第一个月初有一对刚诞生的兔子
* 第二个月之后(第三个月初)它们可以生育
* 每月每对可生育的兔子会诞生下一对新兔子
* 兔子永远不会死去。

1.性能差的斐波那契数列
long long Fib(int n)
 {
     if(n<3) return 1;
      return Fib(n-1)+Fib(n-2);
 }
 int main()
 {
     printf("%d\n",Fib(3));
     system("pause");
     return 0;

算法分析:

   图解:

  [以Fib(6)为例进行说明](https://img-blog.csdn.net/20180408194839933?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01pc3NfX0h5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)


   2^0+2^1+2^2+2^3+...+2^n=a1 (1-q^n)/1-q =2^n

   综上该算法的斐波那契数列的时间复杂度为:O(2^n)
                          空间复杂度为:O(n)

上述算法的菲波那切数列存在效率非常低,对其时间复杂度进行优化。

优化一:采用尾递实现:(尾递归:函数的最后一条语句是对自身的调用,且没有其他的表达式)

long Fib(long first ,long second, long n)
{
    if(n<3)
        return 1;
    else if(n==3)
        return first+second;
    else
        return Fib(second,first+second,n-1);
}
int main()
{
    printf("%d\n",Fib(1,1,6));
    system("pause");
    return 0;
}
 图解:

 Fib(1,1,6)   Fib(1,2,5)   Fib(2,3,4)   Fib(3,5,3) =3+5=8

 综上该算法的斐波那契数列的时间复杂度为:O(n)
                        空间复杂度为:O(n)

优化二:采用迭代方法实现:(该方法性能最好)

long long Fib(int n)
{
    long long  first =1;
    long long  second = 1;
    long long  ret = 0;
    int i = 3;
    for(i=3;i<=n;i++)
    {
        ret =first+second;
        first=second;
        second =ret;
    }
    return ret;
}


int main()
{
    printf("%d\n",Fib(6));
    system("pause");
    return 0;
}
     综上该算法的斐波那契数列的时间复杂度为:O(n)
                           空间复杂度为:O(1)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值