我编写了一个函数来递归地求和值,但是它不符合ES6中尾调用优化的条件(原因我不能说清楚)。
function sum(...values) {
if(!values.length) {
return 0;
}
return values.shift() + sum(...values);
}如何将其更改为符合优化条件?
发布于 2015-04-15 14:15:43
你需要做的
return sum(…);做一个合适的尾叫。在您的示例中,在递归调用之后仍然执行+操作,这使得这个操作无法工作。
典型的方法是使用带累加器参数的助手函数:
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);
}在列表上递归时,还可以(Ab)使用列表本身:
function sum(...values) {
switch (values.length) {
case 0: return 0;
case 1: return values[0];
default: values.unshift(values.shift()+values.shift());
return sum(...values);
}
}
// or alternatively:
function sum(acc, ...values) {
switch (arguments.length) {
case 0: return 0;
case 1: return acc;
default: values[0] += acc;
return sum(...values);
}
}https://stackoverflow.com/questions/29652586
复制相似问题