我有一个函数,我想我理解为什么它每次都会返回“hi”,但除了将值设置为该类的本地成员之外,我不知道如何处理它。
private String findDataFolder(File folder) {
if (folder != null) {
if (folder.listFiles() != null) {
for (File file : folder.listFiles()) {
if (file.isFile()) {
if (file.getParent().contains(
DATA_DIRECTORY)) {
System.out.println("is this happening");
String result = file.getParent();
return result;
}
} else {
findDataFolder(file);
}
}
}
}
return "hi";
}
“isthishappening”IS每次输出,但是,递归的最底部部分没有返回,最后调用它是,'hi'我知道它是如何预期但是想知道是否有一种返回值'备份'的方法。我之前已经避免过这样做,只是设置一个私人成员,但知道如何不再这样做会很高兴
编辑:删除了removeExtraDirectoryInformation函数,因为它不是真的相关而且只是噪音
答案 0 :(得分:2)
我刚刚意识到当前代码中存在一个额外的缺陷。因为您正在进行分支搜索,我们需要做一些其他事情而不是直接返回分支。
private String findDataFolder(File folder) {
if (folder != null) {
if (folder.listFiles() != null) {
for (File file : folder.listFiles()) {
if (file.isFile()) {
if (file.getParent().contains(
DATA_DIRECTORY)) {
System.out.println("is this happening");
String result = file.getParent();
return result;
}
} else {
String result = findDataFolder(file);
if(!result.equals("hi"))
return result;
}
}
}
}
return "hi";
}
所以基本上,这不是线性递归,而是复合递归(或者它被调用的任何东西。)因为你使用for-loop
,我们有多个文件,但最初的解决方案我提供只会返回第一个for循环的结果,这不是我们正在寻找的。 p>
一种选择是跟踪数组或列表中的所有内容。但是,由于目标是找到正确的文件夹,我会假设只有一个正确的答案,我们一找到它就会发现,我们会将其发送到根
您返回"hi"
的部分确实很有用,我们知道" hi"不是文件夹路径。找到文件夹后,它会立即将结果发送到递归树。如果没有找到," hi"将返回,上面的for循环可以继续到下一个文件夹。
答案 1 :(得分:2)
每次调用递归函数时,都必须检查是否找到了正确的目录:
private String findDataFolder(File folder) {
if (folder != null) {
if (folder.listFiles() != null) {
for (File file : folder.listFiles()) {
if (file.isFile()) {
if (file.getParent().contains(
DATA_DIRECTORY)) {
System.out.println("is this happening");
String result = file.getParent();
return result;
}
} else {
String result = findDataFolder(file);
if (!("hi").equals(result)) { // check if we found the right directory, if so return it
return result;
}
}
}
}
}
return "hi";
}