我有一個代碼段,真的很難理解這種遞歸模式。奇怪的Java遞歸代碼
private void indexDirectory(IndexWriter indexWriter, File dataDirectory,
String suffix) throws IOException {
System.out.println("Data directory before: " + dataDirectory.getName());
File[] files = dataDirectory.listFiles();
for (File file : files) {
System.out.println("File name : " + file.getName());
if (file.isDirectory()) {
indexDirectory(indexWriter, file, suffix);
} else {
indexFileWithIndexWriter(indexWriter, file, suffix);
}
}
System.out.println("Data directory : " + dataDirectory.getName());
}
dataDirectory包含一個目錄的路徑,在該目錄中它有幾個子目錄和文件。
因此文件[]數組的樣子,
C:\projects\test\.classpath,
C:\projects\test\.project,
C:\projects\test\.settings,
C:\projects\test\build,
C:\projects\test\build.xml,
C:\projects\test\dist,
C:\projects\test\src,
C:\projects\test\WebContent
的.classpath和的.project是文件,而.settings是一個目錄包含4個文件。所以當第三次迭代去.settings目錄被調用,並且它有4個文件在其中。因爲.settings是一個目錄,file.isDirectory正在變得true 和同樣的方法(indexDirectory)將調用最新的參數值。所以dataDirectory值被.settings取代。當代碼執行進入循環時,它將轉到其他部分,因爲它找到.settings目錄中的文件。
一旦迭代了4次(因爲它只有4個文件),它會假設完成循環。
但奇怪的是DataDirectory目錄值過得去舊的價值它有取代並開始撥打下一個項目有數組中以前(這是構建目錄)。
有人可以解釋爲什麼它發生那樣,沒有完成循環..我希望我解釋清楚,如果沒有請問我。
非常感謝。
腳本的輸出是什麼?從你所描述的內容看,它看起來像是完成了'.settings'的循環,然後退出'indexDirectory',從而繼續循環查找'dataDirectory' ... –
想象一下,調用完全不同的方法而不是'indexDirectory'。調用完成後,您當然希望完全像以前一樣繼續執行所有變量。遞歸中沒有魔法,唯一的區別是調用了相同的方法。 –