Вот для сравнения сейчас накалякал на коленке: функция удаления непустой папки (которая может содержать вложенные папки и т.д.)
С рекурсией: -
13 строк
function removeFolder(cat) {
var dir = readdir(cat);
for (var i = 0; i < dir.length; i++) {
if (isFile(dir[i])) {
unlink(dir[i]);
} else {
removeFolder(dir[i]);
}
}
rmdir(cat);
}
Без рекурсии: -
35 строк
function removeFolder(cat) {
var dir = readdir(cat),
stack = [];
for (var i = 0; i < dir.length; i++) {
if (isFile(dir[i])) {
unlink(dir[i]);
} else {
stack.push({
i: i,
dir: dir,
cat: cat
});
cat = dir[i];
dir = readdir(cat);
i = -1;
continue;
}
if (i === dir.length - 1 && stack.length) {
rmdir(cat);
var last = stack.pop();
cat = last.cat;
dir = last.dir;
i = last.i;
}
}
rmdir(cat);
}
Вариант на одних циклах в 2.5 раза больше, понять его сложнее и сложнее модифицировать.
Мне кажется это самоочевидно, я даже не понимаю о чём тут можно спорить.
Конечно, когда у нас хвостовая рекурсия, то её с оптимизировать можно проще, т.к. не нужно создавать стек, но это уже частный случай.