gpt4 book ai didi

java - 奇怪的 Java 递归代码

转载 作者:行者123 更新时间:2023-11-29 03:41:20 27 4
gpt4 key购买 nike

我有一段代码,并且真的很难理解这种递归模式。

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 包含一个目录的路径,其中包含多个子目录和文件。

所以 files[] 数组看起来像,

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 取代。当代码执行进入循环时,它将转到 else 部分,因为它在 .settings 目录中找到了文件。

一旦它迭代了 4 次(因为它只有 4 个文件),它就应该完成循环。

但奇怪的是 dataDirectory 值被它拥有的旧值所取代,它开始调用先前数组中的下一个项目(即 build 目录)。

谁能解释一下为什么会这样,没有完成循环。我希望我解释清楚了,如果没有请问我。

非常感谢。

最佳答案

第一次调用方法indexDirectory时,里面有8个文件(包括目录)。

因此,您的 for 循环 for (File file : files) { 将至少迭代 8 次。 (A)

现在,在8个文件中,找到了.settings目录。并且您理解正确,它将使用 dataDirectory = .settings 重新调用 indexDirectory。此时,状态 (A)

有 5 次迭代未决

当递归调用完成时,控件到达状态 (A) 并且第 4 次迭代从 dataDirectory = build 开始。

栈帧如下:

enter image description here

Frame 2 完成后,Frame 1 将继续执行。

关于java - 奇怪的 Java 递归代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13010376/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com