2013-08-04 4 views
1

Je sais que cette question a déjà été posée auparavant, mais j'ai un exemple précis auquel je pensais. Actuellement, je un morceau de code, sorta de pseudocode bien, parce que je ne suis pas à mon terminal de travail:traverser un répertoire en utilisant des boucles

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 
} 

Est-ce possible de faire avec juste pour les boucles, parce que vous ne pouvez pas savoir au moment de la compilation combien de sous-répertoires il y aura au moment de la compilation. Pseudocode est très bien ou une explication ou un algorithme. Je n'ai vraiment besoin de rien parce que j'aime mieux ma solution récursive, mais j'aimerais vraiment savoir si c'est possible. Ainsi que la théorie derrière cela.

+1

je le mettre en œuvre quelque chose comme [ce] (http://stackoverflow.com/a/12569958/179910). La réponse de Loki Astari est également valable. –

+1

Directement en dessous de la définition de Boost.Filesystem ['récursive_directory_iterator'] (http://www.boost.org/doc/libs/1_54_0/libs/filesystem/doc/reference.html#Class-recursive_directory_iterator) dans sa documentation, il y a est une explication simplifiée de la façon dont cela fonctionne. –

Répondre

2

Pour la théorie voir la réponse haut voté ici: Can every recursion be converted into iteration?

Pratiquement:

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 
    } 
} 

J'ai essayé de suivre confusion étrange syntaxe de votre pseudcode, espérons qu'il est encore lisible.

+0

Désolé pour mon pseudo pseudo impair, trop c et Lua à la fin. Donc, nous créons une sorte de pile ou de file d'attente et pop et pousser des choses sur elle? – Taka

+0

Pas de problème;) Oui, exactement. Je suppose que toute récursion typique déployée en itération nécessite une collection pour fonctionner à la place de la trace de pile contenant tous les arguments de chaque appel récursif. – BartoszKP

1

Cela dépend de la conception de la classe dir. Si les sous-répertoires sont enregistrés dans un tableau ou dans une liste, vous pouvez utiliser une valeur de taille maximale pour la boucle for. Cette valeur sera définie lors de l'exécution. Si les sous-répertoires sont sauvegardés, vous devrez utiliser une boucle while.

espère que cela aide ChronosMOT

Questions connexes