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

Как понять рекурсию в JavaScript

Автор оригинала: Joel P. Mugalu.

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

Для меня это было потому, что

  1. Рекурсия сама по себе жесткая концепция, а также
  2. Некоторые из учебных пособий и статей, которые я читал не понятно.

По какой-то причине большинство статей, которые объяснили рекурсию, использовали пример факториальных чисел и последовательность фибоначчи. Это означало, что я должен был понять, как работали номера Фибоначчи, затем соединяют это, чтобы рекурсию.

Но мы принимаем другой маршрут в этой статье.

Что такое рекурсия?

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

Какие? Да, функция продолжает вызывать себя, но с меньшим входом каждый раз.

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

То же самое с рекурсией: Функция продолжает вызывать меньший вход и в конечном итоге останавливается.

Но функция не решает для себя, когда остановиться. Мы говорим это, когда остановиться. Мы даем функцию состояние, известное как Базовый чехол Отказ

Базовый случай – это условие, которое сообщает функцию, когда перестать вызывать себя. Он любит рассказывать функции, что последний круг в гонке будет так, что он перестает работать после этого круга.

Примеры рекурсии

Хорошо, это рекурсия. Давайте посмотрим на несколько примеров, чтобы понять, как работает рекурсион.

Помните, как вы узнали о петлях? Первый пример, который вы, вероятно, сделали, это программа обратной передачи. Давайте сделаем это.

Во-первых, давайте понять, что мы хотим сделать нашу программу. Подсчитайте с данного номера к наименьшему количеству, вычитаете 1 каждый раз.

Учитывая номер 5, мы ожидаем, что вывод будет что-то вроде:

// 5
// 4
// 3
// 2
// 1

Хорошо, как мы можем изменить эту программу с рекурсией?

let countDown = number => {
    //base case
    if (number === 0) {
        return;
    }
    console.log(number);
    return countDown(number - 1);
};
console.log(countDown(5)) // 5, 4, 3, 2, 1

Так Что именно здесь происходит?

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

Вы никогда не будете бежать на гонке, не зная, как долго гонка, не так ли?

Если вы не сообщаете функции, когда остановиться, то произойдет что-то называемое Stackoverflow. Стек будет заполнен функциями, которые называются, но не возвращаются или не снимаются с стека.

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

Итак, эффективно, это то, что происходит:

// The current input is 5
// Is 5 equal to 0 ?
// No, Ok so lets log 5 to the console.
// Its calls Itself again with number - 1 OR 5 - 1;
// The current input is 4
// Is 4 equal to 0 ?
// No, Ok so lets log 4 to the console
// Repeats until input is 0 so then function stops calling itself. 

Хорошо, это имеет смысл. Давайте попробуем другой пример.

Вы знаете, как мы можем сказать, что номер даже с использованием оператора остальных (%)? Таким образом, если какое-либо количество% 2, то это число даже или если какое-либо число% 3, то это число нечетное.

Ну, оказывается, есть другой метод.

Если мы непрерывно вычереем два из числа до тех пор, пока наименьшее число равно 0, ни 1, то мы можем сказать, даже ли число или нечетное.

Давайте попробуем это с рекурсией. Итак, дано тогда номер 6 Наша программа должна вернуть «Даже» потому что. Учитывая 7, наша программа должна вернуться «странно» потому что.

Давайте увидимся в коде.

let oddOrEven = (number) => {
    if (number === 0) {
        return 'Even';
    } else if (number === 1) {
        return 'Odd';
    } else {
        return oddOrEven(number - 2);
    }
};
console.log(oddOrEven(20)) // Even
console.log(oddOrEven(75)) // Odd
console.log(oddOrEven(98)) // Even
console.log(oddOrEven(113)) // Odd

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

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

Рекурсия против петлей

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

Но рекурсивные функции очень элегантны.

Так какой самый лучший выбор? Эффективность или скорость?

Вот цитата из книги красноречивый JavaScript.

На данный момент вам могут быть интересно, почему в мире вы когда-либо выберете, чтобы написать рекурсивную функцию над циклом. Я имею в виду петли проще, правда?

Ну, это правда – но есть некоторые проблемы, которые легче решить с рекурсией. Если вы хотите исследовать одну такую проблему, то рассмотрение чтения Глава 3 красноречивого JavaScript.

Теперь, когда вы обнаружили новую суперпуклость Давайте положем это к некоторому использованию.

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

Упражнения

Если вы хотели бы дальнейшего броски самостоятельно, затем рассмотрите возможность решения этих рекурсивных проблем.

  1. Напишите программу, которая меняет строку, используя рекурсию. Учитывая строку «FreeCodeCamp» ваша программа должна вернуть «PMANECEACEERF».
  2. Напишите программу, которая возвращает количество раз, когда символ появляется в строке. Ваша программа должна получить строку и характер. Затем он должен вернуть количество раз, когда символ появляется в строке. Учитывая строку «JavaScript» и символ «A», ваша программа должна вернуть 2. Подсказка : Попробуйте выяснить, когда вы хотите, чтобы функция прекратила позвонить себе и как вернуть меньшую версию проблемы каждый раз, когда функция звонит сама.

Это все для этой статьи. Я надеюсь, что это помогло вам дальше понять рекурсию.

Если вам понравилась эта статья, вы можете связаться со мной на Твиттер .

Оригинал: “https://www.freecodecamp.org/news/understanding-recursion-in-javascript/”