首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改此代码以在ES6中启用尾调用优化?

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

Stack Overflow用户
提问于 2015-04-15 14:10:26
回答 1查看 439关注 0票数 3

我编写了一个函数来递归地求和值,但是它不符合ES6中尾调用优化的条件(原因我不能说清楚)。

代码语言:javascript
复制
function sum(...values) {
  if(!values.length) { 
    return 0; 
  }
  return values.shift() + sum(...values);
}

如何将其更改为符合优化条件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-15 14:15:43

你需要做的

代码语言:javascript
复制
return sum(…);

做一个合适的尾叫。在您的示例中,在递归调用之后仍然执行+操作,这使得这个操作无法工作。

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

代码语言:javascript
复制
 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)使用列表本身:

代码语言:javascript
复制
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);
    }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29652586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档