Что такое рекурсия и когда она полезна?

Рекурсия — это повторное применение какого-либо процесса. В JavaScript рекурсия включает в себя функции, которые вызывают себя несколько раз, пока не достигнут базового условия. Базовое условие позволяет выйти из цикла рекурсии, поскольку в противном случае функция будет вызывать себя бесконечно. Рекурсия очень полезна при работе со структурами данных, содержащими вложенность, где количество уровней в глубину неизвестно.

Например, у вас может быть поток комментариев, возвращенных из базы данных, которые существуют в плоском массиве, но должны быть вложены для отображения в пользовательском интерфейсе. Каждый комментарий является либо комментарием верхнего уровня (без родителя), либо ответом на родительский комментарий. Комментарии могут быть ответом на ответ на ответ на ответ… Мы не знаем заранее, на сколько уровней в глубину может быть комментарий. Здесь может помочь рекурсия.

Пример кода:

const nest = (items, id = null, link = "parent_id") =>
  items
    .filter(item => item[link] === id)
    .map(item => ({ ...item, children: nest(items, item.id) }))

const comments = [
  { id: 1, parent_id: null, text: "First reply to post." },
  { id: 2, parent_id: 1, text: "First reply to comment #1." },
  { id: 3, parent_id: 1, text: "Second reply to comment #1." },
  { id: 4, parent_id: 3, text: "First reply to comment #3." },
  { id: 5, parent_id: 4, text: "First reply to comment #4." },
  { id: 6, parent_id: null, text: "Second reply to post." }
]

nest(comments)
/*
[
  { id: 1, parent_id: null, text: "First reply to post.", children: [...] },
  { id: 6, parent_id: null, text: "Second reply to post.", children: [] }
]
*/
Вход в полноэкранный режим Выход из полноэкранного режима

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

Примечание:

  • Рекурсия полезна при работе со структурами данных, содержащими неизвестное количество вложенных структур.

  • Рекурсия должна иметь базовое условие, при выполнении которого происходит выход из цикла, иначе она будет вызывать себя бесконечно.

Спасибо за чтение…
Счастливого кодинга!

Оцените статью
Procodings.ru
Добавить комментарий