Освоение рекурсии в JavaScript: изучение различных методов на примерах кода

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

Метод 1: базовая рекурсия
Самый простой способ реализовать рекурсию — использовать простую рекурсивную функцию. Давайте рассмотрим пример, в котором мы хотим напечатать числа от 1 до заданного предела.

function printNumbersRecursive(n) {
  if (n > 0) {
    printNumbersRecursive(n - 1);
    console.log(n);
  }
}
printNumbersRecursive(5);

Метод 2: хвостовая рекурсия
Хвостовая рекурсия — это метод, при котором рекурсивный вызов является последней операцией в функции. Этот подход позволяет повысить производительность и избежать ошибок переполнения стека для больших входных данных. Вот пример печати чисел с использованием хвостовой рекурсии:

function printNumbersTailRecursive(n, current = 1) {
  console.log(current);
  if (current < n) {
    printNumbersTailRecursive(n, current + 1);
  }
}
printNumbersTailRecursive(5);

Метод 3: рекурсия с аккумулятором
В некоторых случаях полезно накапливать результаты во время выполнения рекурсии. Давайте изменим наш предыдущий пример, чтобы числа накапливались в массиве:

function printNumbersWithAccumulator(n, current = 1, result = []) {
  if (current > n) {
    console.log(result);
    return;
  }
  result.push(current);
  printNumbersWithAccumulator(n, current + 1, result);
}
printNumbersWithAccumulator(5);

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

function printOddNumbers(n) {
  if (n > 0) {
    if (n % 2 !== 0) {
      console.log(n);
    }
    printEvenNumbers(n - 1);
  }
}
function printEvenNumbers(n) {
  if (n > 0) {
    if (n % 2 === 0) {
      console.log(n);
    }
    printOddNumbers(n - 1);
  }
}
printOddNumbers(5);