Проверяет понимание способов сохранения состояния между рекурсивными вызовами без глобальных переменных.
При рекурсии состояние (например, счётчик вызовов) должно быть доступно на каждом уровне. Глобальные переменные создают побочные эффекты и усложняют тестирование. Вместо этого счётчик передаётся как аргумент и возвращается в результате, либо используется замыкание.
Функция принимает счётчик, увеличивает его и передаёт дальше. Результат возвращается вместе со счётчиком, что позволяет сохранить состояние без внешних переменных.
function countCalls(n, counter = 0) {
counter++;
if (n <= 0) return { result: 0, counter };
const next = countCalls(n - 1, counter);
return { result: next.result + 1, counter: next.counter };
}
const { result, counter } = countCalls(5);
console.log(result, counter); // 5, 6Замыкание позволяет хранить счётчик в приватной переменной, доступной только внутри функции. Это удобно, когда нужно скрыть состояние от внешнего кода.
function createCounter() {
let count = 0;
return function recurse(n) {
count++;
if (n <= 0) return 0;
return recurse(n - 1) + 1;
};
}
const countCalls = createCounter();
console.log(countCalls(5)); // 5
// count недоступен снаружиТакой подход используется в алгоритмах с backtracking, обходе деревьев, подсчёте глубины рекурсии. Он делает функции чистыми и предсказуемыми, что важно для тестирования и отладки.
Передача счётчика параметром или использование замыкания — надёжные способы сохранить состояние в рекурсии без глобальных переменных. Выбор зависит от того, нужно ли состояние наружу: параметр — для явной передачи, замыкание — для инкапсуляции.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию