如何修改此代码以在ES6中启用尾调用优化?

时间:2015-04-15 14:10:26

标签: javascript recursion ecmascript-6 tail-call-optimization

我已经编写了一个递归求和值的函数,但它不符合ES6尾部调用优化的标准(原因我无法清晰表达)。

function sum(...values) {
  if(!values.length) { 
    return 0; 
  }
  return values.shift() + sum(...values);
}

如何更改它才有资格进行优化?

1 个答案:

答案 0 :(得分:7)

你需要做

return sum(…);

制作合适的tail call。在您的示例中,{/ 1}}操作在递归调用之后仍然执行,这使得它不起作用。

典型的方法是使用带累加器参数的辅助函数:

+

在列表上递归时,您也可以(ab)使用列表本身:

 function sum(...values) {
     function sumTo(acc, values) {
         if (!values.length) return acc;
         else return sumTo(acc+values.shift(), values); // tail-recursive call
     }
     return sumTo(0, values);
 }