【问题标题】:calculate sum of the arrays within array using recursion使用递归计算数组中数组的总和
【发布时间】:2020-11-08 19:21:28
【问题描述】:

谁能帮我完成这个任务?我不明白该怎么做。 我需要使用递归找到这个数组的总和。 [ 5,7 [ 4, [2], 8, [1,3], 2 ], [ 9, [] ], 1, 8 ]

如果它是一个常规数组,我可能能够找到总和,但是这里的这个在数组中包含数组有点令人困惑。

【问题讨论】:

  • 欢迎您!您缺少逗号 (,) 并且不一致...[5, 7, [4, [2], 8, [1, 3], 2], [9, []], 1, 8]。
  • 这是作业吗?
  • 不用递归很简单:[5, 7, [4, [2], 8, [1, 3], 2], [9, []], 1, 8].flat(Infinity).reduce((sum, value)=>sum+value)
  • 是的。这是一个家庭作业;)我必须使用递归
  • @ibrahimmahrir 。我在这里作弊的唯一人就是我自己。但我需要它。我就是这样学习的。无论如何我都会尝试一下,这实际上就是我现在正在做的事情。深入研究递归并试图了解如何在这里完成。

标签: javascript arrays recursion


【解决方案1】:

使用递归非常简单,只需遍历数组并为每个元素检查它是否是另一个数组,如果是则调用它的函数并将其结果添加到总和中,如果不是(意思是它是否是一个数字) 然后只需将元素添加到总和中,如下所示:

function sumArray(arr) {                          // takes an array and returns its sum
  let sum = 0;                                    // the sum

  for(let i = 0; i < arr.length; i++) {           // for each element in the array
    if(Array.isArray(arr[i])) {                   // if the element is an array
      sum += sumArray(arr[i]);                    // call the function 'sumArray' on it to get its sum then add it to the total sum
    } else {                                      // otherwise, if it is a number
      sum += arr[i];                              // add it to the sum directly
    }
  }

  return sum;
}

顺便说一句,使用数组方法reduce、一些arrow functions 和ternary operator 可以大大缩短上述代码,而不是if/else,如下所示:

const sumArray = arr => arr.reduce((sum, item) =>
  sum + (Array.isArray(item) ? sumArray(item) : item)
, 0);

【讨论】:

    【解决方案2】:

    解决方案示意图:

    计算总数的“函数”应该对数组参数进行常规循环。

    对于每个元素:

    • 如果是数字,则将其添加到总数中(正常情况),
    • 但如果它是一个数组,则添加应用在这个内部数组上的“函数”返回的结果(递归情况)。

    【讨论】:

      【解决方案3】:

      我想这可能就是你要找的Recursion - Sum Nested Array

      function sumItems(array) {
        let sum = 0;
        array.forEach((item) => {
          if(Array.isArray(item)) {
           sum += sumItems(item);
          } else {
          sum += item;
          }
        })
        return sum;
      }
      

      【讨论】:

      • 两件事。请不要发布仅代码的答案;答案还应该解释 OP 方法的代码和问题。并且不要重新发布另一个问题的答案,而是将其作为可能的副本提供,并在 cmets 中提供链接。 (拥有足够的声望,您还将获得为重复添加接近投票的特权。)
      【解决方案4】:

      解决这个问题的一种方法是将数组分成两部分,计算每部分的总和,然后将结果相加。

      例如,下面的实现将数组分成其第一个元素和所有剩余元素。如果第一个元素是数组,则递归应用sum,否则直接使用该值。对于数组的其余部分,递归应用sum。

      const sum = function(array) {
          if (array.length === 0) return 0;
          let first = array[0];
          if (Array.isArray(first))
              first = sum(first);
          const rest = sum(array.slice(1));
          return first + rest;
      }
      
      const array = [ 5, 7, [ 4, [ 2 ], 8, [ 1, 3 ], 2 ], [ 9, [] ], 1, 8 ];
      console.log(sum(array));  // 50
      

      【讨论】:

        猜你喜欢
        • 2018-12-10
        • 2022-07-06
        • 2019-09-26
        • 2013-11-26
        • 2021-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多