2012-06-20 74 views
1

我知道递归的基础知识,但在给定的代码中,我很难理解流程。
请帮我家伙...了解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

您是否尝试使用调试器来跟踪它? –

+1

哪一部分你不明白? – Crazenezz

+1

请参阅[这个问题](http:// stackoverflow。com/questions/11116157/understanding-flow-of-recursion)寻求更多帮助......我不得不说,尽管这是我见过的最差的书面递归目录扫描器之一。 – Alnitak

回答

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

+0

嗨。 我知道它在做什么,但我对流程的困惑意味着如何在堆栈窗体中执行以及执行的顺序是什么 – ASH

+0

这取决于'internalNames'的顺序。如果'internalNames'首先是文件夹,那么搜索将关闭文件夹的所有级别,直到没有更多的子文件夹,然后它将查看文件。 – eboix

+0

假设最初有一个目录的路径,它包含8个文件夹。那么第一个if条件是真实的然后是for循环ll b然后再次searchfolder()ll b被调用,现在假设这次第一个内部名称是一个文件。所以第一条件如果条件ll b假设所以第二条如果会遇到文件ll b现在加到“alist”现在我的问题是:return语句是否会运行并且是,那么控制器将在哪里移动?希望你得到我的困惑... – ASH

1

考虑这个递归代码树的探险家。 searchFolders方法将扫描当前目录中的每个文件/文件夹并列出它,因此您可以说它将从根节点获取所有子项。

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

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

0

短,考虑递归退出:

if (fo.isFile()) { 

    alist.add(fo.toString()); 


} 

fo是一个文件,添加文件路径alist和退出; 如果这个递归退出条件不成立,则fo是一个目录,然后再次递归直到递归退出---'fo'是一个文件。

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