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表示法确实比较清晰的很衡量一个算法设计的好坏了。

  • 相关阅读:
    分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结
    动态规划 BZOJ1925 地精部落
    线性DP SPOJ Mobile Service
    线性DP codevs2185 最长公共上升子序列
    数位DP POJ3208 Apocalypse Someday
    线性DP POJ3666 Making the Grade
    杨氏矩阵 线性DP? POJ2279 Mr.Young's Picture Permutations
    tarjan强连通分量 洛谷P1262 间谍网络
    树链剖分 BZOJ3589 动态树
    二分图 BZOJ4554 [Tjoi2016&Heoi2016]游戏
  • 原文地址:https://www.cnblogs.com/webor2006/p/6743573.html
Copyright © 2011-2022 走看看