• 斐波那契数列的递归实现


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

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

    下面用代码来实现它:

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

    那该递归算法的时间复杂度是多少呢?应该时间耗得不多吧,看下面这个实验,把运行次数由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表示法确实比较清晰的很衡量一个算法设计的好坏了。

  • 相关阅读:
    结构与联合
    信号与槽知识点
    函数
    元对象编译器moc
    堆与栈
    More Effective C++ (虚拟构造函数)
    重载 覆盖 隐藏
    继承专题
    PowerDesigner 的常用方法(转)
    搜狗输入法导入Google词库bug
  • 原文地址:https://www.cnblogs.com/webor2006/p/6743573.html
Copyright © 2020-2023  润新知