Показать сообщение отдельно
  #38 (permalink)  
Старый 08.07.2014, 20:04
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Вот для сравнения сейчас накалякал на коленке: функция удаления непустой папки (которая может содержать вложенные папки и т.д.)

С рекурсией: - 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 раза больше, понять его сложнее и сложнее модифицировать.
Мне кажется это самоочевидно, я даже не понимаю о чём тут можно спорить.

Конечно, когда у нас хвостовая рекурсия, то её с оптимизировать можно проще, т.к. не нужно создавать стек, но это уже частный случай.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 08.07.2014 в 20:12.
Ответить с цитированием