#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. Пожалуйста, предлагайте рекомендации, предложения и т. Д. Вместо полных примеров кода для вопросов домашнего задания.