卡在一个简单的递归练习上,变得"max stack error"


  • 求和包含嵌套数组的数组中的所有数字
  • arraySum([1,[2,3],[[4]],5](;//15

到目前为止我已经写了这篇文章。。

var newArray = array.slice();
    newArray = newArray.flat(Infinity);
    var sum = 0;
    if (newArray.length === 1) {
        return array[0];
    }
    if (newArray.length === 0) {
        return 0;
    }
    for (var i = 0; i < newArray.length; i++) {
        if (typeof newArray[i] === "number") {
            sum += newArray[i];
        }
    }
    return arraySum(newArray);
};

如果我输入返回和,它是完美的,但是这个练习需要递归。

如果要使用递归,则将for循环替换为返回数组第一个元素的值,再加上数组中其他元素的总和:

const arraySum = (array) => {
  var newArray = array.slice();
  newArray = newArray.flat(Infinity);
  var sum = 0;
  if (newArray.length === 1) {
    return array[0];
  }
  if (newArray.length === 0) {
    return 0;
  }
  return array[0] + arraySum(newArray.slice(1));
};
console.log(arraySum([1,[2,3],[[4]],5]));

但是.flat在每次迭代中的表现似乎都很奇怪。考虑只做一次,在传递的第二个默认参数中:

const arraySum = (arr, arrFlat = arr.flat(Infinity)) => {
  return arrFlat.length
    ? arrFlat[0] + arraySum(arr, arrFlat.slice(1))
    : 0;
};

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

或者检查当前被迭代的元素是否是一个数组,而不是使用.flat,看看是否需要使用arraySum的另一个递归调用来迭代子数组,或者只添加数字:

const arraySum = (arr) => {
  if (!arr.length) return 0;
  const rest = arraySum(arr.slice(1));
  return typeof arr[0] === 'number'
    ? arr[0] + rest
    : arraySum(arr[0]) + rest;
};

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

最新更新