Застрял на простом упражнении по рекурсии, получив «ошибку максимального стека»

#javascript #arrays #recursion

#javascript #массивы #рекурсия

Вопрос:

  • Суммируйте все числа в массиве, содержащем вложенные массивы
  • 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);
};
  

Если я введу возвращаемую сумму, она будет работать идеально, но упражнение требует рекурсии.

Ответ №1:

Если вы хотите использовать рекурсию, замените 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]));  

Или проверьте, является ли текущий элемент, по которому выполняется итерация, массивом, а не use .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]));  

Комментарии:

1. Пожалуйста, предлагайте рекомендации, предложения и т. Д. Вместо полных примеров кода для вопросов домашнего задания.