如果我可以tco一个命名的递归函数,应该有一种方法可以tco匿名递归function.If,下面是我的递归函数和TCO函数,请解释一下如何做到这一点。
function recursive(length, callback) {
tco((function (i, sum) {
var args = arguments;
if (i > length) {
console.log("break statement");
callback(sum)
return sum
} else {
return args.callee(i + 1, sum + i)
}
}))(0, 0)
}
function tco(f) {
var value;
var active = false;
var accumulated = [];
return function accumulator() {
accumulated.push(arguments);
if (!active) {
active = true;
while (accumulated.length) {
value = f.apply(this, accumulated.shift());
}
active = false;
return value;
}
}
}发布于 2016-09-19 07:35:40
尾部调用优化
ES6建议对尾部呼叫系统进行更改,这是一种引擎优化。尾部调用是指当一个函数作为另一个函数的最后一个语句被调用时,如下所示:
function doSomething() {
return doSomethingElse(); // tail call
}ECMAScript 6试图减少严格模式下某些尾部调用的调用堆栈的大小。通过这种优化,只要满足以下条件,就会清除并重用当前堆栈帧,而不是为尾部调用创建新的堆栈帧。
必须打开
也许最难避免的情况是使用闭包。因为闭包可以访问包含范围内的变量,所以尾部调用优化可能会被关闭。例如:
"use strict";
function doSomething() {
var num = 1,
func = () => num;
// not optimized - function is a closure
return func();
}利用TCO优化:
考虑这个函数,它计算阶乘:
"use strict";
function factorial(n) {
if (n <= 1) {
return 1;
} else {
// not optimized - must multiply after returning
return n * factorial(n - 1);
}
}为了优化函数,您需要确保乘法不会在最后一次函数调用之后发生。
"use strict";
function factorial(n, p = 1) {
if (n <= 1) {
return 1 * p;
} else {
let result = n * p;
// optimized
return factorial(n - 1, result);
}
}来源: Nicholas Zakas写的一本令人敬畏的书,Understanding ECMAScript 6。
https://stackoverflow.com/questions/39562817
复制相似问题