了解RECURSION的流程

时间:2012-06-20 09:04:09

标签: java recursion

我知道递归的基础知识,但在给定的代码中,我很难理解流程 请帮帮我们......

public ArrayList<String> searchFolders(File fo) {

    if (fo.isDirectory()) {

        String internalNames[] = fo.list();



        for (int i = 0; i < internalNames.length; i++) {
            searchFolders(new File(fo.getAbsolutePath() + "\\"+ internalNames[i]));
            path = fo.getAbsolutePath() + "\\" + internalNames[i];
        }
    }
    if (fo.isFile()) {

        alist.add(fo.toString());


    }


    return alist;
}

3 个答案:

答案 0 :(得分:2)

基本上,此代码获取目录的所有内容并将其添加到全局变量alist

你给它一个目录。 如果它是一个文件,那么它将其名称添加到列表中并返回该方法(文件不能包含子文件夹)。

如果是文件夹,则会列出文件夹中的所有内容:

String internalNames[] = fo.list();

然后对文件夹中的每个项目执行相同的搜索:

searchFolders(new File(fo.getAbsolutePath() + "\\"+ internalNames[i]));

因此,如果您当前搜索的项目是文件(如果fo.getAbsolutePath() + "\\"+ internalNames[i]是文件的目录),那么它只是将文件添加到全局ArrayList。

否则,如果它是一个文件夹,它会搜索它,就像刚搜索到它刚看到的文件夹一样,并列出文件夹中的所有文件。

您似乎没有使用变量path

当您返回alist时,您将返回到目前为止在文件夹(及其子文件夹)中找到的所有文件。 您没有返回文件夹名称,因为在fo.isDirectory()时,您没有将其名称添加到alist

enter image description here

答案 1 :(得分:1)

将此递归代码视为树资源管理器。 searchFolders方法将扫描当前目录中存在的每个文件/文件夹并列出它,因此您可以说它将从根节点获取所有子项。

获得列表后,它会在根节点的每个子节点中调用自己(再次搜索文件夹和文件),并更新路径以了解它在哪里搜索。

当它找到没有要浏览的文件夹的所有子节点(甚至下降到n级)时它将停止,但只有文件。

答案 2 :(得分:0)

简而言之,请考虑递归退出:

if (fo.isFile()) {

    alist.add(fo.toString());


}

fo是文件时,将文件路径添加到alist并退出; 如果这个递归退出条件不成立,fo是一个目录,然后重复递归,直到递归退出---'fo'是一个文件。

所以这个searchFolders方法找到文件夹和子文件夹中的每个文件,将它们的名称作为列表返回!