首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Node.js尾部调用优化:可能还是不可能?

Node.js尾部调用优化:可能还是不可能?
EN

Stack Overflow用户
提问于 2014-04-24 13:17:50
回答 3查看 13.9K关注 0票数 32

到目前为止,我喜欢JavaScript,并决定使用Node.js作为我的引擎,部分原因是this,它声称Node.js提供总拥有成本。但是,当我尝试使用Node.js运行此代码(显然是尾部调用)时,它会导致堆栈溢出:

代码语言:javascript
复制
function foo(x) {
    if (x == 1) {
        return 1;
    }
    else {
        return foo(x-1);
    }
}

foo(100000);

现在,我做了些调查,找到了this。在这里,似乎是说我应该这样写:

代码语言:javascript
复制
function* foo(x) {
    if (x == 1) {
        return 1;
    }
    else {
        yield foo(x-1);
    }
}

foo(100000);

但是,这会给我带来语法错误。我尝试过它的各种组合,但在所有情况下,Node.js似乎都对某些东西不满意。

从本质上讲,我想知道以下几点:

  1. 做还是不做Node.js做总拥有成本?
  2. 这个神奇的yield在Node.js中是如何工作的?
EN

回答 3

Stack Overflow用户

发布于 2016-03-02 04:34:18

自2016.05.17起,node.js终于支持总体拥有成本,version 6.2.0

它需要使用--use-strict --harmony-tailcalls标志来执行,以使总体拥有成本正常工作。

票数 4
EN

Stack Overflow用户

发布于 2017-05-15 05:06:12

6.2.0 -带有'use strict‘和’--harmony_tailcall‘

仅适用于10000的小尾部优化递归(如问题中所示),但函数调用自身99999999999999次失败。

使用'use strict‘和’--

‘的和声7.2.0

即使有99999999999999次呼叫,flag也能无缝快速地工作。

票数 1
EN

Stack Overflow用户

发布于 2016-09-26 18:49:50

更简洁的答案...如上所述,自实施之日起...

总拥有成本有效。它不是防弹的,但它是很好的。这是阶乘(7000000,1)。

代码语言:javascript
复制
>node --harmony-tailcalls -e "'use strict';function f(n,t){return n===1?t:f(n-1,n*t);}; console.log(f(7000000,1))"
Infinity

这就是没有总拥有成本的情况。

代码语言:javascript
复制
>node -e "'use strict';function f(n,t){return n===1?t:f(n-1,n*t);}; console.log(f(15669,1))"
[eval]:1
function f(n,t){return n===1?t:f(n-1,n*t);}; console.log(f(15669,1))
      ^

RangeError: Maximum call stack size exceeded
at f ([eval]:1:11)
at f ([eval]:1:32)
at f ([eval]:1:32)
at ...

不过,它确实让它一路走到了15668。

至于收益率,请参阅其他答案。可能应该是一个单独的问题。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23260390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档