我已经编写了一个递归求和值的函数,但它不符合ES6尾部调用优化的标准(原因我无法清晰表达)。
function sum(...values) {
if(!values.length) {
return 0;
}
return values.shift() + sum(...values);
}
如何更改它才有资格进行优化?
答案 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);
}