具有递归函数的解决方案

时间:2016-06-29 14:40:59

标签: algorithm recursion

假设我有:

Class Folder{
    int id;
    String name;
    Folder subFolder;
}

我怎么能显示文件夹的层次结构,假设我不知道有多少个子文件夹。例如:

  1. FolderA包含FolderB(2级)
  2. FolderA包含FolderB,其中包含FolderC(3个级别)。
  3. 我正在寻找使用递归函数的算法解决方案。 这是我的尝试:

    function displaySubFolders(Folder f){
        print(f.name);
        if(f.subFolder is NULL) {return 0;}
        else{
            displaySubFolders(f.subFolder);
        }
    }
    

3 个答案:

答案 0 :(得分:3)

一个简单的递归解决方案:

public void printHierarchy(Folder f){
    if(f == null) {
        return;
    }
    f.display();
    printHierarchy(f.subFolder);        
}

答案 1 :(得分:2)

如果我正确地解释你的问题,看起来你所拥有的是一个链表,其中每个父母只有一个孩子。在这种情况下,完全避免递归可能更有效(尽管稍后将更难扩展到多个后代。我想,递归对于它更具扩展性。)

function display_hierarchy(Folder folder) {
    while (folder is not NULL) {
        print folder.name;
        folder = folder.subFolder;
    }
}

这样做的主要优点是无论链表有多大,计算所需的内存量都保持不变。然而,递归策略在递归时会占用越来越多的堆栈空间。

答案 2 :(得分:1)

这个怎么样?

function displaySubFolders(Folder f, string indent){
    print(indent);
    print(f.name);
    if(f.subFolder is NULL) {return 0;}
    else{
        displaySubFolders(f.subFolder, indent+"    ");
    }
}

打印

FolderA
    FolderB
        FolderC
    FolderD

如果A包含BD,则B包含C

您可以使用"--""**"或任何您想要的内容替换空格。