Создайте функцию, которая вычисляет сумму всех чисел в зубчатом массиве.
Мы собираемся написать функцию с именем sumArray
, которая будет принимать массив ar
в качестве аргумента.
Для этой функции вам дается зубчатый массив. Неровный массив - это массив, содержащий комбинацию чисел и других массивов. Массивы могут иметь многоуровневую глубину.
Цель функции - найти сумму всех чисел внутри зубчатого массива.
Пример:
let ar = [1, 2, [15, [23], [5, 12]], [100]]; //output: 158
Затем мы найдем способ заставить нашу функцию пройти через все внутренние массивы, чтобы получить нашу сумму. Одна из ключевых функций для этого - рекурсия.
Первое, что мы сделаем, - это создадим переменную с именем sum
и присвоим ей значение 0
. Это переменная, которую мы вернем в конце функции.
let sum = 0;
Затем мы будем использовать цикл for для просмотра нашего массива:
for(let el of ar){ if (Array.isArray(el)){ el = sumArray(el); } sum += el; }
Посмотрим, что происходит внутри цикла for.
В нашем первом операторе if мы проверяем, является ли текущий повторяемый элемент массивом, используя метод Array.isArray()
. Если это массив, мы используем рекурсию, чтобы снова подключить этот массив к нашей функции. Это будет рекурсивно переходить на сколько угодно уровней в глубину массива, пока мы не зайдем в тупик на каком-то числе.
Используя наш пример, приведенный выше, я нарисую, что происходит.
[1, 2, [15, [23], [5, 12]], [100]]
Первый и второй элементы являются числами, поэтому они добавляются к нашей переменной sum
, но наш третий элемент - это массив.
[15, [23], [5, 12]]
Мы используем рекурсию, чтобы перейти на следующий уровень вглубь нашего основного массива. Когда этот массив переходит в цикл for, первый элемент добавляется к нашему sum
. Но мы снова сталкиваемся с другим массивом во втором элементе, поэтому мы используем рекурсию, чтобы перейти на следующий уровень.
Теперь мы на трех уровнях.
[23]
Поскольку в этом массиве есть только один элемент, который не является массивом, мы добавляем это число в наш sum
и возвращаемся на второй уровень нашего основного массива.
[15, [23], [5, 12]]
Цикл for переходит к следующему элементу, который также является массивом.
[5, 12]
Мы рекурсивно переходим к массиву, просматриваем его и добавляем 5
и 12
в sum
.
Функция возвращается на первый уровень основного массива и переходит к следующему элементу, равному [100]
.
[1, 2, [15, [23], [5, 12]], [100]]
Мы используем рекурсию, чтобы вернуться ко второму уровню нашего основного массива снова. Как только мы входим в цикл for, мы добавляем 100
к sum
.
Функция продолжает проверять каждый элемент. Он либо добавляет число к sum
, либо переходит в другой массив. Этот процесс повторяется для каждого уровня массивов. После того, как он завершит проверку всех элементов в этом массиве для этого конкретного уровня, он продолжит работу в обратном направлении, убедившись, что все числа добавлены.
Это переключение между уровнями продолжается до тех пор, пока функция, наконец, не достигнет первого уровня нашего основного массива и не достигнет конца.
Когда цикл for заканчивается, мы возвращаем наш sum
.
Вот остальная часть функции:
Если вы нашли этот алгоритм полезным, ознакомьтесь с другими моими статьями о решениях для алгоритмов JavaScript: