Чтобы понять рекурсию, вам нужно понять рекурсию.
Определение
Рекурсия - это просто вызов функции внутри функции, но не любой функции, вызывая ту же функцию, частью которой являются другие функции. Это как сумка внутри сумки и внутри этой сумки; вы получите еще одну сумку.
Худший пример когда-либо
Иметь сумку внутри сумки - это нормально. У всех нас было или есть это. Вспомните школьные годы, когда в рюкзаке был пенал (сумка). Что касается кодирования или языков кодирования, вы открываете ящик 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