关于 js 尾递归优化时间复杂度的疑惑

2019-10-16 11:14:36 +08:00
 Alander

当写出一段代码用尾递归来计算阶乘时:

function factorial (num, total) {
    if (num === 1) return total;
    return factorial(num - 1, num * total);
}

这段代码的时间复杂度是多少呢?为什么?

js 引擎在处理这段代码的时候会优化操作吗,比如我写下 factorial(120, 1),难道代码是直接执行 120 * 119 * 118 ... 1 吗?如果是,那将 factorial(120, 1)转换为这个常量整体是否需要一定时间?这段代码的时间复杂度是怎么算出来的呢?

我太菜了,想听听大佬们对于这段代码的时间复杂度的看法

2991 次点击
所在节点    程序员
21 条回复
secondwtq
2019-10-16 22:49:16 +08:00
我之前稍微研究过这个问题
印象是实现 PTC 处理 stacktrace 会有麻烦,V8 觉得不值当的就还没做
估计看这熊样到 V8 死了也不会做了

另外 PTC 的定义大概只是类似于”tail call 使用 O(1) 空间“之类的,跟时间复杂度没关系,跟实际性能也没关系

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/609825

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX