Ответ
В большинстве случаев циклы эффективнее рекурсии, так как:
- Не создают новых вызовов в стеке
- Потребляют меньше памяти
- Имеют предсказуемую производительность
Рекурсия может привести к переполнению стека при большой глубине вызовов. Однако, в некоторых случаях рекурсивные решения более читаемы (например, обход деревьев).
Пример с факториалом:
// Цикл
function factorialLoop(n) {
let result = 1;
for (let i = 2; i <= n; i++) result *= i;
return result;
}
// Рекурсия
function factorialRec(n) {
return n <= 1 ? 1 : n * factorialRec(n - 1);
}
Оптимизация: современные JS-движки поддерживают TCO (Tail Call Optimization), которая позволяет избежать переполнения стека при хвостовой рекурсии.