Рубрики
Без рубрики

Рекурсия и российские гнездовые куклы

Этот пост – третью серии, адаптированной из моих конференц-разговоров, забавных, дружелюбных компьютерных наук …. Помечено с компьютером, JavaScript, CodeNewie, начинающим.

Этот пост является третью серии, адаптированной из моих конференц-разговоров, Весело, дружелюбная компьютерная наука .

Русские гнездовые куклы – отличная метафора для рекурсии. Если вы никогда не играли с гнездовыми куклами, они именно то, что они звучат. Каждая кукла одинакова, за исключением его размера, и они каждый открыт, а кукла внутри меньше и меньше, пока вы не дойдете до самого маленького ребенка, который не открывается. Когда вы добираетесь до самого маленького ребенка, вы поменяете процесс, закрывая каждую куклу по одному в обратном порядке.

Рекурсия имеет репутацию в компьютерной науке о том, чтобы быть пугающим, но что это именно? Рекурсия – это процесс, с помощью которого функция вызывает себя прямо или косвенно. Функция, которая вызывает сама, называется «рекурсивной функцией» (если кто-то задает вам, что в интервью, это не вопрос уловки 🤗).

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

Это все звучит достаточно просто, но это может быть очень трудно написать рекурсивный код. И может быть еще сложнее удерживать ментальную картину того, что происходит в рекурсивной функции. Итак, давайте посмотрим на код кода.

count() { 
  return this.countNestedDolls(this.bigDoll); 
} 

countNestedDolls(doll) { 
  const child = doll.open(); 

  // base case
  if (!child) { 
    return 1; 
  } else { 
    return this.countNestedDolls(child) + 1; 
  } 
} 

В этом примере Считать косвенно рекурсивно и Countnesteddolls это рекурсивная функция. Итак, давайте пройдем через этот код, как если бы он был выполнен не на компьютере, а настоящим человеком. Допустим, я передаю вам гнездовую куклу, и скажу вам считать их.

  • Вы собираетесь начать с самой большой куклы (строка 2).
  • Вы собираетесь открыть его (строка 6).
  • У этого есть ребенок. Вы собираетесь сделать тот же процесс с ребенком, вспоминая, когда вы вернетесь, чтобы закрыть его, что вы собираетесь добавить один для крупнейшей куклы, которую вы открыли (строка 12).
  • Теперь вы открываете вторую по величине куклу, которая также имеет ребенка внутри. Поэтому вы будете повторять процесс, вспоминая, когда вы вернетесь, чтобы закрыть эту куклу, которую вы собираетесь добавить один.
  • И так далее, пока вы не доберетесь до самой маленькой куклы в центре. Вы пытаетесь открыть его, но он не открывается. Нет ребенка. Таким образом, вы начинаете процесс подсчета там, возвращая 1 (строку 10).
  • Затем вы выходите из этого вызова функции, чтобы закрыть свою родительскую куклу и помнить, что вы должны добавить 1, когда вы закрываете его, так что у вас есть 1 +.
  • Затем вы выходите из следующей вызовы функций, чтобы закрыть его родитель и добавить 1, так что у вас есть 2+.
  • И так далее, пока вы не вернете окончательную сумму вложенных кукол, которые были в наборе.

Если это было трудно следовать записанным, вот картина, которая может помочь. Вы продолжаете падать через каждую вызов функции, пока не достигнете базового случая, возвращая 1. Затем вы добавляете 1 в возвращенное значение, когда вы проходите через каждую вызов функции в стеке.

Рекурсия использует

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

Точно потому, что рекурсия – это традиционная стратегия информатики, не делает ее по своей неотъемлемой элегантным решением. Если нет легко понять вложенность в модели, вы пытаетесь представлять программно, то рекурсия не является лучшим случаем использования. Убедитесь, что вы не представляете свой код, чтобы соответствовать «элегантным решениям». Вместо этого напишите свой код, чтобы представлять модели реальных мировых моделей, с которыми вы работаете. Следующий разработчик, который касается вашего кода, благодарит вас 🤗

Оригинал: “https://dev.to/mercedes/recursion-and-russian-nesting-dolls-2oan”