使用递归Javascript的数组之和

Wen*_*ndy 6 javascript arrays recursion

寻找通过递归来解决这个问题的方法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
Run Code Online (Sandbox Code Playgroud)

Aks*_*jan 16

符合您所有要求的单线:

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
Run Code Online (Sandbox Code Playgroud)

推理

  • 在递归调用中,您需要将任务建模为简化为基本情况.在这种情况下,最简单的基本情况是空数组 - 此时,您的函数应返回零.
  • 还原步骤应该是什么?那么你可以建模数组的总和作为将第一个元素添加到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
Run Code Online (Sandbox Code Playgroud)