gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:32:55 25 4
gpt4 key购买 nike

我写了一个函数来递归求和,但它不符合 ES6 中尾调用优化的标准(原因我说不清楚)。

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

如何更改它以符合优化条件?

最佳答案

你需要做的

return sum(…);

制作一个合适的tail call .在您的示例中,+ 操作仍在递归调用之后 执行,这使得它不起作用。

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

 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);
}
}

关于javascript - 如何修改此代码以在 ES6 中启用尾调用优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29652586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com