这是尾巴吗? (JavaScript)的

时间:2015-06-09 21:16:31

标签: javascript tail-call-optimization

让你有一个递归函数,如:

Blah.prototype.add = function(n) {
    this.total += n;
    this.children.forEach(function(child) {
        child.add(n);
    });
};

child.add()是否有尾巴通话?如果不能这样写的话呢?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

是的,这是一个尾调:

function(child) {
    child.add(n);
// ^ tail
}

然而这里没有任何东西是尾递归的,因为它不是直接的递归调用。

同样this.children.forEach(…)add方法中的尾调用。

但是,在本机forEach方法中调用回调可能不是尾调用优化的(除了最后一个之外的所有方法都不能)。您可以通过将函数重写为

来强制它
Blah.prototype.add = function(n) {
    "use strict";
    this.total += n;
    let l = this.children.length;
    if (!l--)
        return;
    for (let i=0; i<l; i++)
        this.children[i].add(n);
    this.children[i].add(n); // tail-recursion
};

请注意,如果您还没有return他们的结果,这些尾调用都不会优化。