2013-08-04 4 views
1

Я знаю, что этот вопрос уже давно задан, но у меня есть конкретный пример, о котором я думал. В настоящее время у меня есть кусок кода, Сорта псевдокода, хотя, потому что я не на моем рабочем терминале:Перемещение каталога с использованием петель

void setTree(string dir) { 
    add dir to dirlist 
    create dir object //contains list of subdirs and files 
    for subdir in dir.subs do 
     setTree(subdir) 
    end 
} 

Возможно ли это сделать с только для петель, потому что вы не можете знать во время компиляции сколько подкаталогов будет во время компиляции. Псевдокод в порядке или какое-то объяснение или алгоритм. Мне действительно ничего не нужно, потому что мне нравится мое рекурсивное решение, но я действительно хотел бы узнать, возможно ли это. Как и теория, стоящая за ней.

+1

Я бы реализовать что-то вроде [это] (http://stackoverflow.com/a/12569958/179910). Ответ Локи Астари * хорошо * стоит прочитать. –

+1

Непосредственно под определением Boost.Filesystem ['recursive_directory_iterator'] (http://www.boost.org/doc/libs/1_54_0/libs/filesystem/doc/reference.html#Class-recursive_directory_iterator) в своей документации, там является упрощенным объяснением того, как это работает. –

ответ

2

Для теории см верхний голосовала ответ здесь: Can every recursion be converted into iteration?

Практически:

void setTree(string dir) { 
    add dir to dirlist 
    while (dirlist not empty) { 
    d = dirlist.pop() 
    create d object 
    for subdir in d.subs do 
     append subdir to dirlist 
    end 
    } 
} 

Я пытался следовать странный синтаксис перепутать вашего pseudcode, надеюсь, что это все-таки читаемым.

+0

Извините за мой странный псевдокод, слишком много c и Lua в последнее время. Итак, мы создаем стек или делаем что-то вроде очереди и поп и нажимаем на него вещи? – Taka

+0

Без проблем;) Да, точно. Я полагаю, что любая типичная рекурсия, развернутая в итерации, требует коллекции для работы вместо трассировки стека, содержащей все аргументы от каждого рекурсивного вызова. – BartoszKP

1

Это зависит от дизайна класса dir. Если поддиры сохраняются в массиве или списке, есть значение размера, которое вы можете использовать как максимальное для цикла for. Это значение будет определено во время выполнения. Если поддиры сохраняются в противном случае, вам будет необходимо использовать цикл while.

Надеется, что это поможет ChronosMOT

Смежные вопросы