到目前为止,我喜欢JavaScript,并决定使用Node.js作为我的引擎,部分原因是this,它声称Node.js提供总拥有成本。但是,当我尝试使用Node.js运行此代码(显然是尾部调用)时,它会导致堆栈溢出:
function foo(x) {
if (x == 1) {
return 1;
}
else {
return foo(x-1);
}
}
foo(100000);
现在,我做了些调查,找到了this。在这里,似乎是说我应该这样写:
function* foo(x) {
if (x == 1) {
return 1;
}
else {
yield foo(x-1);
}
}
foo(100000);
但是,这会给我带来语法错误。我尝试过它的各种组合,但在所有情况下,Node.js似乎都对某些东西不满意。
从本质上讲,我想知道以下几点:
yield
在Node.js中是如何工作的?发布于 2016-03-02 04:34:18
自2016.05.17起,node.js终于支持总体拥有成本,version 6.2.0。
它需要使用--use-strict --harmony-tailcalls
标志来执行,以使总体拥有成本正常工作。
发布于 2017-05-15 05:06:12
6.2.0 -带有'use strict‘和’--harmony_tailcall‘
仅适用于10000的小尾部优化递归(如问题中所示),但函数调用自身99999999999999次失败。
使用'use strict‘和’--
‘的和声7.2.0
即使有99999999999999次呼叫,flag也能无缝快速地工作。
发布于 2016-09-26 18:49:50
更简洁的答案...如上所述,自实施之日起...
总拥有成本有效。它不是防弹的,但它是很好的。这是阶乘(7000000,1)。
>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
这就是没有总拥有成本的情况。
>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。
至于收益率,请参阅其他答案。可能应该是一个单独的问题。
https://stackoverflow.com/questions/23260390
复制相似问题