Проверяет понимание рекурсивного обхода дерева и того, стоит ли выносить обработку ветви в отдельную функцию или оставлять её вложенной в основную.
При обходе дерева или графа часто возникает вопрос: делать ли функцию обработки ветви вложенной в основную функцию обхода или выносить её отдельно. Ответ зависит от того, нужна ли эта логика где-то ещё, использует ли она замыкание и насколько сложна.
Вложенная функция удобна, если она использует переменные из внешней области видимости (замыкание) и не должна быть доступна снаружи. Например, при рекурсивном обходе можно передавать аккумулятор или контекст.
function traverse(node) {
const result = [];
function visit(n) {
if (!n) return;
result.push(n.value);
visit(n.left);
visit(n.right);
}
visit(node);
return result;
}Если обработка ветви — самостоятельная логика, которая может переиспользоваться или тестироваться отдельно, её стоит вынести. Это упрощает отладку и уменьшает связанность.
function processBranch(node, result) {
if (!node) return;
result.push(node.value);
}
function traverse(node, result = []) {
processBranch(node, result);
if (node) {
traverse(node.left, result);
traverse(node.right, result);
}
return result;
}В итоге, вложенная функция — это инструмент для инкапсуляции, а не обязательное правило. Выбирайте вариант, который делает код понятнее и проще для поддержки.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию