Чтобы понять рекурсию, вам нужно понять рекурсию.

Определение

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

Худший пример когда-либо

Иметь сумку внутри сумки - это нормально. У всех нас было или есть это. Вспомните школьные годы, когда в рюкзаке был пенал (сумка). Что касается кодирования или языков кодирования, вы открываете ящик Pandora на простом примере.

Функция bag() вызывается оператором вызова функции bag(); внутри функции bag(). Это выходит за рамки бесконечности, и в этом примере мы создали бесконечный цикл. Через несколько секунд ваша программа зависнет.

Что именно здесь происходит, так это то, что у запущенных программ есть стек вызовов. Всякий раз, когда вызывается функция, стек вызовов получает новую запись наверху (stack.push(functionName)). Когда функция завершает работу и возвращается к вызывающей стороне, верхняя запись удаляется stack.pop(functionName). Поскольку мы повторно вызываем одну и ту же функцию, stack.push(functionName) никогда не будет выполнен.

Стек увеличивается до тех пор, пока окончательно не переполнится. Обратите внимание: если ваш мозг переполняется во время кодирования, куда вы пойдете? Верно, переполнение стека, поэтому оно и называется. Стек кучи вашего мозга переполнен, поэтому рекурсия - это просто еще один способ создания циклов. Бесконечные циклы не очень полезны, несмотря на то, что они есть в встроенном ПО в качестве рабочего / основного цикла.

Как остановить бесконечность?

Поскольку мы не программируем прошивку и не хотим бесконечных циклов, как мы собираемся остановить бесконечность? С условием остановки. Как бы просто это ни звучало, так же просто: всего лишь простое if-выражение, чтобы остановить вселенную!

Мы можем складывать мешки в мешки, пока не появится noMoreBag, куда мы сможем запихнуть наши мешки. Кстати, помещая массивы в массивы, мы называем их зубчатыми массивами. Обычно мы используем индексы или счетчики в качестве проверки условий для завершения рекурсии. При достижении определенной суммы, сравните следующий пример, упаковка останавливается после третьего рекурсивного вызова.

Но ждать!

Есть обстоятельство, о котором вы, возможно, еще не узнали. У меня быстрый вопрос: Если я поставлю оператор после фигурных скобок оператора if, сколько раз этот оператор будет выполнен?

Верно, 3 раза, Эээ! 4 раза. Первый звонок и 3 рекурсивных звонка! У меня быстрый второй вопрос: Когда будет выполнен этот оператор?

Сразу после того, как рекурсия выполнила свой последний рекурсивный вызов. Изучите следующий код.

Сравните рисунок 1 для вывода на консоль.

Учтите это при работе с рекурсией. Не говоря уже об O (N²) (временная сложность от O до N Square). Но это тема для себя. Это 3-х минутное руководство!

Выводы

  • Помните о рекурсии, она может создавать бесконечные циклы
  • Всегда имейте неисправное состояние и проверяйте его должным образом.
  • Дважды проверьте, как часто операторы будут выполняться внутри рекурсивного вызова и после рекурсивного вызова.
  • И последнее, но не менее важное: чтобы понять рекурсию, вам нужно понять рекурсию.

Читать дальше







Больше контента на plainenglish.io