使用递归Javascript的数组之和

时间:2016-05-24 23:34:41

标签: 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

8 个答案:

答案 0 :(得分:13)

满足您所有要求的单线:

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

推理

  • 在递归调用中,您需要将任务建模为 reduction 到基本案例。在这种情况下,最简单的基本情况是空数组 - 此时,您的函数应返回零。
  • 减少步骤应该是什么?那么你可以建模一个数组的总和作为将第一个元素添加到数组其余部分的sum的结果 - 在某些时候,这些连续的调用最终将导致致电sum([]),您已经知道的答案。这正是上面的代码所做的。
  • array.slice(1) creates a shallow copy of the array starting from the first element onwards,并且原始数组上不会发生任何突变。为简明扼要,我使用了a ternary expression

故障:

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

答案 1 :(得分:3)

你已经走上了正确的轨道,但是考虑到这个总和可以采用一个可选的第二个参数(默认为零)来指示从...开始求和的位置。

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

答案 2 :(得分:1)

arr = [1,2,3,4]
sum = arr.reduce((acc,curr)=> acc + curr)

答案 3 :(得分:0)

你真的不需要sum函数中的add函数只是内联函数并以0开头作为起始点,或者可选地检查i变量是否为undefined并将其初始化为0!

date_range

答案 4 :(得分:0)

您有两种解决方案:

  • 您可以使用 .reduce()方法
  • 或执行简单的尾递归

减少

function sum(a, b) {
  return a + b;
}

const array = [1, 2, 3, 4, 5, 6];

//In our reduce, we will apply our sum function, 
//and pass the result as the next value
const res = array.reduce(sum);

使用递归

function sumRec(array, acc = 0, index) {
    //We will update our accumulator, and increment
  // the value of our current index
  return index === array.length
  ? acc
  : sumRec(array, acc += array[index], ++index);
}

console.log(sumRec(array, 0, 0));

就个人而言,我发现第一种解决方案更优雅。

答案 5 :(得分:0)

function sumArr(arr){
  if(arr.length>1){
    return arr.pop()+sumArr(arr);
  }else{
    return arr[0];
  }
}

答案 6 :(得分:0)

function sumNumbersRecursively(input){
    if (input.length == 0){
        return 0;
    } else{
       return input.shift() + sumNumbersRecursively(input);
    }
}

console.log(sumNumbersRecursively([2,3,4]))

答案 7 :(得分:-1)

如果你不得不多次调用 sum ,那么使用二进制方法:将数组分成两半并重复每个部分。当长度为1时,返回单个值。

这对你有用吗?我担心我不记得数组切片的JS语法,所以我的递归语句可能在细节上有误。

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