HTML / CSSJavaScriptNode jsПаттерны проектированияПрактические

Рекурсия

Рекурсия — это процесс, в котором функция вызывает сама себя, прямо или косвенно

ℹ️Важно

Каждая рекурсивная функция должна иметь условие прерывания рекурсии В противном случае вызов функции приведет к бесконечному циклу.

Хвостовая рекурсия — это когда последним исполняемым оператором рекурсивной функции будет оператор return с вызовом этой же функции

Простейший (классический) пример рекурсии — вычисление факториала

1function factorial ( num, result ) {
2 result = ( !result ? 1 : res ) * num--
3 return num < 2 ? result : factorial ( num, result )
4}
1function factorial ( n, result = 1 ) {
2 result *= n--
3 return n < 2 ? result : factorial ( n, result )
4}
1function factorial ( n, result ) {
2 while ( n > 1 )
3 return factorial ( n-1, n * ( !result ? 1 : result ) )
4 return result
5}
1function factorial ( n, result ) {
2 return n < 2 ? !result ? 1 : result :
3 factorial ( n-1, n * ( !result ? 1 : result ) )
4}

В JavaScript каждый вызов функции добавит кадр вызова в стек. Когда вызов завершается, кадр удаляется из стека. Однако рекурсивная функция не завершается сразу. Она вернет рекурсивный вызов самой себя Если хвостовая рекурсия достаточно глубокая, это может привести к переполнению стека и генерации исключения RangeError

Исключение RangeError возникает тогда, когда глубина рекурсии превышает 10000

Практика 👩‍💻👩‍💻

Используя следующую структуру, отрисовать ее в DOM используя createElement и реализовать поиск

1const directories = [
2 {
3 dir: {
4 name: "root",
5 },
6 },
7 {
8 dir: { name: "child" },
9 },
10 {
11 dir: [
12 {
13 dir: { name: "John" },
14 },
15 {
16 dir: { name: "hello" },
17 },
18 {
19 dir: [
20 {
21 dir: { name: "nested" },
22 },
23 {
24 dir: [
25 {
26 dir: { name: "nested" },
27 },
28 {
29 dir: { name: "one" },
30 },
31 ],
32 },
33 ],
34 },
35 ],
36 },
37];
  • Отрисовать структуру в DOM
  • Создать input для поиска (использовать event change что бы получить значение из input)
  • Подсветить все найденные элементы
  • Если результаты не найдены вывести "Результатов нет"

Дополнительно

  • Сделать accordion (по клику на родителя скрывать/показывать дочерние элементы)
Hello