zoukankan      html  css  js  c++  java
  • 斐波那契数列的递归实现

     说到递归算法,应该无人不知,那怎么算递归算法的时间复杂度,我想应该不一定每个人都知道了,所以下面来学习学习。

    对于递归算法举例,最经典的就是斐波那契数列了,而它的定义也贴一下:

    下面用代码来实现它:

    不多解释,因为比较容易,下面来看下输出结果:

    那该递归算法的时间复杂度是多少呢?应该时间耗得不多吧,看下面这个实验,把运行次数由10改到50,直观来感受一下:

    运行结果:

    仔细的观察一下输了结果,是不是从快到慢,而且后面慢得已经是需要等半分钟才能算出一个数了,可见递归的时间损耗是相当吓人的~

    下面具体来算一下它的时间复杂度:

    而重点是分析下面这个条件分支:

    可以得到t(n) = t(n-1) + t(n-2) + O(1);其中O(1)表示中间有一个加法运算,这是常量级别的。

    那如何换算成大O表达示呢?这里采用自然归纳法【当然还有其它换算方法,反正我也不知道~】,看下面:

    当n=0或1时它的时间复杂度是O(1),而它是<=O(2 ^ n)的,这是假设,怎么论证呢:当n=0时数=2^0,而当n=1时数<2^1;

    这时可以假设斐波那契数列递归算法的时间复杂度就是<=O(2 ^ n)

    进一步假设:时间复杂度是O(2 ^n)在t(n-1)上也成立,那么基于t(n) = t(n-1) + t(n-2) + O(1);可以换算为:

    t(n) = O(2^(n-1)) + O(2^(n-2)) + O(1);

    而O(2^(n-2))是O(2^(n-1))时间的一半,所以O(2^(n-2))=0.5 * O(2^(n-1)),于是乎:

    t(n) = 1.5 * O(2^(n-1)) + O(1);

    而1.5 * O(2^(n-1)) + O(1) <= 2 * O(2^(n-1)) + O(1) <= O(2 ^ (1+n-1)) + 0(2 ^ 0) <= O(2 ^n)

    也就是t(n) <= O(2 ^n)

    所以斐波那契数列递归算法的时间复杂度就是<=O(2 ^ n),所以这就可以看到为啥上面的i增大到50时运行速度非常非常慢了,因为递归实现时间复杂度是指数级别增长的,所以进一步论证大O表示法确实比较清晰的很衡量一个算法设计的好坏了。

  • 相关阅读:
    [LeetCode] 85. 最大矩形
    [LeetCode] 84. 柱状图中最大的矩形
    [LeetCode] 83. 删除排序链表中的重复元素
    [LeetCode] 81. 搜索旋转排序数组 II
    [LeetCode] 82. 删除排序链表中的重复元素 II
    [LeetCode] 80. 删除排序数组中的重复项 II
    [LeetCode] 79. 单词搜索
    [LeetCode] 77. 组合
    转:快乐Node码农的十个习惯
    转:zookeeper3.4.5安装笔记
  • 原文地址:https://www.cnblogs.com/webor2006/p/6743573.html
Copyright © 2011-2022 走看看