Рекурсия – это методика, используемая для решения проблем с компьютером, создавая функцию, которая вызывает сам, пока ваша программа не достигнет желаемого результата.
Этот учебник поможет вам узнать о рекурсии и как он сравнивается с более распространенным циклом.
Что такое рекурсия?
Допустим, у вас есть функция, которая регистрирует номера от 1 до 5. Вот как вы пишете это, используя рекурсию:
function log(num){
if(num > 5){
return;
}
console.log(num);
log(num + 1);
}
log(1);Когда вы запускаете код выше, Журнал Функция просто позвонит себе до тех пор, пока стоимость Num Переменная меньше 5 Отказ
Рекурсивная функция должна иметь хотя бы одно условие, где он перестанет вызов самой вызова, или функция назовет сама до бесконечно, пока JavaScript не выдает ошибку.
Условие, которое останавливает рекурсивную функцию от самого звонка, известна как Базовый чехол Отказ В Журнал Функция выше, базовый случай – когда Num больше, чем 5 Отказ
Почему бы вам не просто использовать петлю?
Любые проблемы, которые вы можете решить с использованием рекурсивной функции, всегда будет иметь альтернативное циклическое решение. Пример выше может быть заменен следующим кодом:
for(let i = 1; i <= 5; i++){
console.log(i);
}Современные языки программирования, такие как JavaScript, уже есть для и в то время как заявления как альтернативы рекурсивным функциям. Но некоторые языки, такие как Cljure, не имеют циклических операторов, поэтому вам нужно использовать рекурсию для неоднократно выполнения куска кода.
Также, а для Цикл требует, чтобы вы узнали, сколько раз вы повторите выполнение кода. Но рекурсивная функция и в то время как Цикл может быть использован для выполнения куска кода, не зная, сколько раз вам нужно повторить его. Вам просто нужно знать условие, которое останавливает выполнение.
Например, предположим, что у вас есть задача следующим образом:
- Случайно выберите число от 1 до 10, пока не получите номер 5.
- Журнал Сколько раз вам нужно выполнить код до возврата случайного метода 5.
Вот как вы это делаете с рекурсивной функцией:
function randomUntilFive(result = 0, count = 0){
if(result === 5){
console.log(`The random result: ${result}`);
console.log(`How many times random is executed: ${count}`);
return;
}
result = Math.floor(Math.random() * (10 - 1 + 1) + 1);
count++;
randomUntilFive(result, count);
}
randomUntilFive();Вы не можете заменить код выше с для петля, но вы можете заменить его с в то время как петля:
let result = 0;
let count = 0;
while (result !== 5) {
result = Math.floor(Math.random() * (10 - 1 + 1) + 1);
count++;
}
console.log(`The random result: ${result}`);
console.log(`How many times random is executed: ${count}`);Помимо вопросов собеседования кодирования, где вы должны решить проблему, используя рекурсию, вы всегда можете найти альтернативное решение, которое использует либо для или в то время как Заявление цикла.
Как прочитать рекурсивную функцию
Рекурсивная функция не интуитивнаправлена или легко понять на первый взгляд. Следующие шаги помогут вам прочитать и понимать рекурсивную функцию быстрее:
- Всегда идентифицируйте Базовый чехол функции перед чем-либо еще.
- Передать аргументы функции, которая немедленно достигнет базового случая.
- Определите аргументы, которые по крайней мере выполнят рекурсивный вызов функции один раз.
Давайте попробуем эти шаги, используя RandomuntiLFive () Пример выше. Вы можете определить базовый случай для этой функции внутри Если Выявление выше:
function randomUntilFive(result = 0, count = 0){
if(result === 5){
// base case is triggered
}
// recursively call the function
}
randomUntilFive();Это означает, что вы можете достичь базового случая, передавая количество 5 в Результат Параметр следующим образом:
function randomUntilFive(result = 0, count = 0){
if(result === 5){
console.log(`The random result: ${result}`);
console.log(`How many times random is executed: ${count}`);
return;
}
}
randomUntilFive(5);Пока Считать Параметр не должен быть ноль, передавая номер 5 Как аргумент на вызов функции выше, удовлетворяет требование шага двух.
Наконец, вам нужно найти аргумент, который по крайней мере выполнит вызов рекурсивной функции один раз. В случае выше, вы можете пройти любой номер, кроме 5 Или вообще ничего не
function randomUntilFive(result = 0, count = 0){
if(result === 5){
console.log(`The random result: ${result}`);
console.log(`How many times random is executed: ${count}`);
return;
}
result = Math.floor(Math.random() * (10 - 1 + 1) + 1);
count++;
randomUntilFive(result, count);
}
randomUntilFive(4);
// any number other than five
// will execute the recursive callИ вы сделали. Теперь вы понимаете, что функция RandomuntiLFive () Будет рекурсивно позвонить себе до ценности Результат равна пятью.
Как написать рекурсивную функцию
Написание рекурсивной функции почти такая же, как читать один:
- Создайте регулярную функцию с базовым случаем, которые могут быть достигнуты с его параметрами
- Пройти аргументы в функцию, которая немедленно вызвала базовый случай
- Передайте следующие аргументы, которые вызывают рекурсивный звонок только один раз.
Допустим, вы пишете функцию для расчета факториалы . Вот факториал пяти:
5*4*3*2*1
Во-первых, базовый случай для этой функции один, поэтому давайте создадим факториал Функция, которая возвращает один:
function factorial(num){
if(num === 1){
return num;
}
}
console.log(factorial(1));Теперь на шаг три. Нам нужно получить рекурсивный звонок в функции и позвонить ему хотя бы один раз. Поскольку факториальный расчет уменьшается число одним на каждом умножении, вы можете имитировать его, передавая Num-1 в рекурсивный звонок:
function factorial(num){
if(num === 1){
return num;
}
return num * factorial(num-1)
}
console.log(factorial(2));И теперь вы закончили. Вы можете проверить функцию, проходя пять до вызова:
console.log(factorial(5));
Заключение
Вы только что узнали, что такое рекурсивная функция и как она сравнивается с общим для и в то время как Список петлей. Рекурсивная функция всегда должна иметь хотя бы один базовый случай, чтобы заставить его перестать вызывать себя или вызвать ошибку.
При чтении рекурсивной функции необходимо имитировать ситуацию, когда базовый случай немедленно выполняется без выполнения рекурсивного вызова.
После того, как у вас есть охваченный базовый случай, вернитесь на один шаг и попробуйте выполнить рекурсивный вызов хотя бы один раз. Таким образом, у вас мозг прогуляется по рекурсивному коду и интуитивно понимает, что он делает.
То же самое касается записи рекурсивной функции. Всегда создайте базовый чехол первым, а затем напишите аргумент, который запускает рекурсивный вызов хотя бы один раз. Отдых будет легче оттуда.
Спасибо за чтение этого учебника
Если вы хотите узнать больше, я писал о Как найти последовательность фибоначчи, используя рекурсию , что является одной из наиболее распространенных проблем рекурсии.
У меня также есть Бесплатная еженедельная рассылка Об учебных пособиях веб-разработчиков (в основном связан с JavaScript).
Оригинал: “https://www.freecodecamp.org/news/what-is-recursion-in-javascript/”