首先,以下是主要代码

 var fib = function(n) {
    if (n===0) return 0
    if (n===2 || n===1) return 1
    return fib(n-1) + fib(n-2)
};   

所以问题是打印斐波纳契数,现在放下问题的逻辑,我可以看到,每当我们将变量n增加1,函数就会被调用2 * n次,所以即使我们考虑通过返回变量来回溯函数,这将是4 * n次主要运算,根据指数乘以时间复杂性的定义,每次我们增加输入变量,运算的次数都应该增加一倍,我认为这里不是这样的情况.

推荐答案

对于朴素的斐波纳契实现,我们确实发现了指数时间复杂性(或者更准确地说是O(2^n)),最明显的是通过查看函数调用的树图.

        F_5
   /          \
  F_3         F_4
/    \      /    \
F_1  F_2   F_3   F_2
          /   \
        F_2   F_1

您可以清楚地看到每一行(1、2、4、...)中的执行次数是如何加倍的

为了说服自己,画出这张F_6的图表(如果需要的话,F_7).

定义指数乘以时间复杂度,每增加一次输入变量,运算次数就应该翻一番

时间复杂度为O(n),时间复杂度为O(n).如果是b=2的话每次只会翻倍.然而,你可以有b=3(每次三倍),b=4(四倍)或b=1.2213,你得到的点.

我们还可以编写代码来为我们计数:

var counter = 0;

function fib(n){
    counter++;    
    if( n <= 1 ){
        return 1;
    }
    return fib(n-1) + fib(n-2);
}

for( var i = 0; i < 15; ++i ){
    counter = 0;
    fib(i);
    console.log("Fib evaluations for " + i + ": " + counter);
}

如果对计数器进行对数绘制,则会得到以下图片,证实了执行时间的指数增长:

enter image description here

Javascript相关问答推荐

Webpack将懒惰加载的模块放入主块中

详细更改参考价值:"

TestCafe预计文本等于以下内容之一

在JavaScript中打开和关闭弹出窗口

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

Phaser框架-将子对象附加到Actor

如何解决CORS政策的问题

未捕获错误:在注销后重定向到/login页面时找不到匹配的路由

当点击注册页面上的注册按钮时,邮箱重复

如何调用名称在字符串中的实例方法?

查找最长的子序列-无法重置数组

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

简单的PayPal按钮集成导致404错误

如何在Angular17 APP中全局设置AXIOS

我可以使用空手道用户界面来获取网页的当前滚动位置吗?

如何在JAVASCRIPT中合并两组对象并返回一些键

try 使用PM2在AWS ubuntu服务器上运行 node 进程时出错

MongoDB通过数字或字符串过滤列表

用Reaction-RT-Chart创建实时条形图

select 2-删除js插入的项目将其保留为选项