首页 > 解决方案 > 在 JS 函数中使用递归的奇怪循环

问题描述

我正在尝试对嵌套数组中的元素求和。例如arraySum([1,[2,3],5,[[4]]])应该返回15

一切似乎都很好,除非我尝试return array.pop() + arraySum(array)进入一个奇怪的无限循环。

一切顺利,直到代码到达该代码。我试图返回数组的值,但我没有发现任何问题。

谁能告诉我我的代码有什么问题?

var arraySum = function(array) {
  
  if(array.length === 0){
      return 0
    }
  if(Array.isArray(array[array.length - 1])){
    var x = array[array.length - 1].reduce((accumulator, currentValue) => accumulator + currentValue);

    array.pop()
    array.push(x)
    return arraySum(array)

    }       

  return  array.pop() + arraySum(array)
};

console.log(arraySum([1,[2,3],5,[[4]]]))

标签: javascriptrecursion

解决方案


一些丰盛的递归在这里解决了我们的问题。问题是您在迭代数组时对其进行了变异,特别是将项目推回其中。在实践中,你永远不应该这样做。

    function arraySum(array) {
      if (array.length === 0) {
        return 0;
      }
      return array.reduce((previous, current) => {
        if (Array.isArray(current)) {
          return previous + arraySum(current);
        }
        return previous + current;
      }, 0);
    }

    console.log(arraySum([1, [2, 3], 5, [[4]]]));


推荐阅读