2013-08-04 291 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)。 Loki Astari的答案也很值得一讀。 –

+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類的設計。如果子元素保存在數組或列表中,則可以使用size-value作爲for循環的最大值。該值將在運行時定義。如果這些分部被保存,否則你必須使用一個while循環。

希望它能幫助 ChronosMOT