Чтобы понять, как работает рекурсия, просто подумайте, как можно разделить то, что вы хотите выполнить, на более мелкие задачи, и как функция может выполнить одну из этих задач, а затем вызывать себя для выполнения следующей - и так далее, пока это закончено. Лично я не считаю печать ящиков лучшим способом изучения рекурсии, поэтому представьте, что вы хотите найти в массиве конкретное значение; пока игнорируйте JavaScript indexOf()/find()
функции или похожие.
Чтобы сделать это, используя циклы, это просто, просто переберите массив и проверьте каждое значение:
//Returns the index of the first occurrence of a value in an array, or -1 if nothing is found
function search(needle, haystack) {
for (let i = 0; i < haystack.length; i++) {
if (haystack[i] == needle) return i;
}
return -1;
}
Сделать это с помощью рекурсии также легко:
function recursiveSearch(needle, haystack, i) {
if (i > (haystack.length - 1)) return -1; //check if we are at the end of the array
if (haystack[i] == needle) return i; //check if we've found what we're looking for
//if we haven't found the value yet and we're not at the end of the array, call this function to look at the next element
return recursiveSearch(needle, haystack, i + 1);
}
Эти функции делают одно и то же, просто по-разному. В рекурсивной функции два оператора if являются базовыми. Функция:
- Проверяет, находится ли текущий элемент за пределами массива (имеется в виду, что мы уже искали каждый элемент), и если да, возвращает -1
- Проверяет, является ли текущий элемент тем, что мы ищем, и если да, возвращает индекс
- Если ни одно из приведенных выше утверждений не применимо, мы вызываем эту функцию рекурсивно, чтобы проверить следующий элемент
- Повторяйте это до тех пор, пока не сработает один из базовых вариантов.
Обратите внимание, что рекурсивные функции обычно вызываются из других вспомогательных функций, поэтому вам не нужно передавать начальные параметры для вызова функции. Например, приведенная выше функция recursiveSearch()
будет закрытой и будет вызываться другой функцией, подобной этой:
function search(needle, haystack) {
return recursiveSearch(needle, haystack, 0);
}
чтобы нам не приходилось включать третий параметр при вызове, что уменьшает путаницу.