JavaScript — Пожалуйста, объясните рекурсивное решение нахождения глубины массива

Пожалуйста, объясните рекурсивное решение нахождения глубины массива

Сначала учебник по рекурсии:

В конечном итоге рекурсия пытается решить самую основную форму проблемы, которую вы можете иметь, а затем постепенно сузить любую сложную проблему до самой основной формы. Таким образом, вам нужно следующее (вероятно, не имеет смысла, пока вы не прочитаете все это):

  1. Вам нужно решить базовый случай.
    • базовый случай также служит в качестве терминального условия . Вы хотите прекратить вызывать функцию рекурсивно в какой-то момент. Как только вы дойдете до базового случая, вам больше не нужно повторять.
  2. Вам нужен шаг сокращения. Вы начинаете с большой проблемы, и вы стремитесь перейти к базовой форме и решить ее (базовый вариант из 1.). Если текущая форма не является базовой, то она не разрешима — вам нужно немного уменьшить проблему и рекурсивно вызвать функцию.

Таким образом, в этом случае базовый случай состоит в том, что вы получаете значение, которое не является массивом. Поскольку это не массив, он не имеет глубины, поэтому вы возвращаете ноль. РЕШИТЬ! Вот и все.

Тем не менее, что произойдет, если вы получите массив? Ну, любой массив будет иметь некоторую глубину. Таким образом, вы можете сосчитать один, а затем получить содержимое массива. Это шаг сокращения — вы уменьшили его с «У меня есть массив неизвестной глубины» до «У меня есть содержимое моего массива». Когда вы рекурсивно вызываете getArrayDepth с содержимым, вы повторно оцените, есть ли у вас массив или нет, и посчитаете соответствующим образом. Если вы суммируете все значения массива с глубиной не менее 1, вы получите глубину.

Пока что мы можем решить следующие вещи

Вход: 42
Выход (глубина): 0
Почему ?: Это базовый случай — это не массив, поэтому мы возвращаем 0 и рекурсивно не вызываем функцию.

Вход: [42]
Выход (глубина): 1
Почему ?: У нас есть массив -{amp}gt;
Глубина отсчета 1 добавить результат рекурсивного вызова с содержанием 42 -{amp}gt;
это базовый случай — это не массив, поэтому мы возвращаем 0 и рекурсивно не вызываем функцию.
Возвращаясь, у нас было 0 и 1 что составляет 1 .

Вход: [[42]]
Выход (глубина): 2
Почему ?: У нас есть массив -{amp}gt;
Глубина отсчета 1 и рекурсивный вызов с содержимым [42] -{amp}gt;
у нас есть массив -{amp}gt;
посчитать глубину 1 и рекурсивно вызвать с содержимым 42 —{amp}gt;
это базовый случай — это не массив, поэтому мы возвращаем 0 и рекурсивно не вызываем функцию.
Возвращаясь, у нас было 0 , 1 и 1 что составляет 2 .

И так далее.

Теперь о том, почему вы используете Math.max и Array#map . Поскольку у массивов может быть много элементов, вы используете .map для вызова getArrayDepth для каждого из них. Это приведет к дальнейшей рекурсии, чтобы решить это, но в конце вы получите массив всех глубин элементов, поэтому ["a", ["b"], [["c"]]] будут преобразованы в [1, 2, 3] . Поскольку вам нужно получить общую глубину, вам нужно наибольшее число — это достигается с помощью Math.max с расширенным синтаксисом для возврата максимального значения.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector