Рекурсия (в программировании) - это вызов функцией самой себя. Например, на JavaScript:
```js
function recursion() {
  recursion();
}
recursion();
```
Тут первый вызов функции recursion на 4й строке запустит рекурсивную функцию, безусловно запускающую саму себя. Это повлечёт падение программы из-за исчерпания стека, поэтому важно продумывать условия остановки рекурсии. Рекурсии без условия остановки успользуются в атаках приводящих к отказу в обслуживании (fork бомбы, DoS).
Рекурсия используется для перебора разных путей выполнения программы или рекуррентных вычислений. Так, например, рекурсией можно обойти бинарное дерево, найти все перестановки цифр в числе или рассчитать факториал, например:
```js
function factorial(n) {
  if (n == 1) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}
var f4 = factorial(4);
console.log(f4);
```
Вызов этого кода приведёт к выводу в консоль JavaScript результата взятия факториала от 4, то есть 24.
Рассмотрим как он работает. Рекуррентная формула для факториала - это F(n) = N * F(n - 1); F(1) = 1. Код функции написан по этой формуле.
Сначала происходит вызов функции factorial с аргументом 4. Так как 4 не равно 1, то будет выполнена вторая ветка условного выражения if. Вторая ветвь условного выражения возвратит результат умножения аргумента на факториал числа на 1 меньшего чем аргумент - число 4 будет запомнено в програмном стеке, пока происходит вычисление factorial(3). Так будет происходить пока аргумент не уменьшится до единицы, тогда функция перестанет вызывать себя вернув единицу. Тогда, наконец, сможет вычислиться сначала factorial(2) = 2 * factorial(1) = 2 * 1 = 2, следом factorial(3) = 3 * factorial(2) = 3 * 2 = 6, следом factorial(4) = 4 * factorial(3) = 4 * 6 = 24. Результат будет записан в переменную f4, которая будет выведена в консоль.
У рекрсии есть недостатки, так вызовы функций могут исчерпать стек и привести к падению программы, так и то, что рекурсии обычно медленее простых циклов, но не всегда получится просто переписать рекрсию в цикл. Например, вычисление факториала можно было написать в виде цикла:
```js
function factorial(n) {
  var result = 1;
  for (var i = 1; i <= n; i++) {
     result *= i;
  }
  return result;
}
```
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence