使用递归 Javascript 的数组总和

新手上路,请多包涵

寻找通过递归解决此问题的方法 sum() 。现在,代码有效,但我应该多次调用 sum() ,并且它不应该改变输入数组。

 var sum = function(array) {
    if(array.length === 0){
        return 0;
    }
    function add(array, i){
        console.log(array[i]);
        if(i === array.length-1){
            return array[i];
        }
        return array[i] + add(array, i+1);
    }
    return add(array, 0);
};
sum([1, 2, 3, 4, 5, 6]) //21

原文由 Wendy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 214
2 个回答

满足您所有要求的单线:

 var sum = function(array) {
    return (array.length === 0) ? 0 : array[0] + sum(array.slice(1));
}

// or in ES6

var sum = (array) => (array.length === 0) ? 0 : array[0] + sum(array.slice(1));

// Test cases
sum([1,2,3]); // 6

var s = [1,2,3];
sum(s); // 6
sum(s); // 6

推理

  • 在递归调用中,您需要将任务建模为 简化 为基本案例。在这种情况下,最简单的基本情况是空数组——此时,您的函数应该返回零。
  • 减少步骤应该是什么?好吧,您可以将数组的总和建模为将 第一个 元素添加到数组其余部分的 sum 的结果 - 在某些时候,这些连续调用最终将导致调用 sum([]) ,您已经知道的答案。这正是上面代码所做的。
  • array.slice(1) 从第一个元素开始创建数组的浅表副本,并且原始数组上不会发生任何突变。为了简洁起见,我使用了 三元表达式

分解:

 sum([1,2,3])
-> 1 + sum([2,3])
-> 1 + 2 + sum([3])
-> 1 + 2 + 3 + sum([])
-> 1 + 2 + 3 + 0
-> 6

原文由 Akshat Mahajan 发布,翻译遵循 CC BY-SA 3.0 许可协议

你走在正确的轨道上,但考虑到 sum 可以采用可选的第二个参数(默认为零)来指示开始求和的位置……

 function sum(array, n) {
    n ||= 0;
    if (n === array.length) {
        return 0;
    } else {
        return array[n] + sum(array, n + 1);
    }
}

原文由 Alnitak 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题