Algorithm 用递归函数求解

Algorithm 用递归函数求解,algorithm,recursion,Algorithm,Recursion,假设我有: Class Folder{ int id; String name; Folder subFolder; } 假设我不知道有多少子文件夹,如何显示文件夹的层次结构。例如: FolderA包含FolderB(2级) FolderA包含FolderB,FolderB包含FolderC(3级) 我正在寻找使用递归函数的算法解决方案。 这是我的尝试: function displaySubFolders(Folder f){ print(f.name);

假设我有:

Class Folder{
    int id;
    String name;
    Folder subFolder;
}
假设我不知道有多少子文件夹,如何显示文件夹的层次结构。例如:

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

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

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

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

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

    public void printHierarchy(Folder f){
        if(f == null) {
            return;
        }
        f.display();
        printHierarchy(f.subFolder);        
    }
    
    这个怎么样

    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
    包含
    B
    D
    B
    包含
    C

    你可以用
    “--”
    “**”
    或任何你想要的东西来替换空格。

    这个怎么样

    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
    包含
    B
    D
    B
    包含
    C


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

    如果我正确解释了您的问题,您看到的似乎是一个链表,其中每个家长只有一个孩子。在这种情况下,完全避免递归可能会更有效(尽管以后很难扩展到多个子体。我认为递归更易于扩展)


    这种方法的主要优点是,无论链表有多大,用于计算的内存量保持不变。然而,递归策略在递归时会消耗越来越多的堆栈空间。

    如果我正确地解释了您的问题,您看到的似乎是一个链表,其中每个父级只有一个子级。在这种情况下,完全避免递归可能会更有效(尽管以后很难扩展到多个子体。我认为递归更易于扩展)


    这种方法的主要优点是,无论链表有多大,用于计算的内存量保持不变。然而,递归策略在递归时会消耗越来越多的堆栈空间。

    我不知道,如果您有子文件夹,您应该要求显示该子文件夹?我需要显示父文件夹名->文件夹名->文件夹名->文件夹名(父文件夹名->子文件夹名->子文件夹名)。不一定是三级层次结构,它可以是5级、6级或更多级。您从不迭代
    f
    的子级。你应该这样做,以找出所有的子文件夹。f只有一个子文件夹,这轮到了一个子文件夹。我不知道,如果你有一个子文件夹,也许你应该要求显示该子文件夹?我需要显示父文件夹名->文件夹名->文件夹名->文件夹名(父文件夹名->子文件夹名->大文件夹名)。不一定是三级层次结构,它可以是5级、6级或更多级。您从不迭代
    f
    的子级。您应该这样做以查找所有子文件夹。f只有一个子文件夹,该子文件夹有一个子文件夹。除非问题缺少有关文件夹实际包含内容的非常重要的详细信息,否则这是特定问题的正确答案。除非您将拥有一个子文件夹数组,否则不需要迭代子文件夹,递归将不必要地扰乱调用堆栈。除非问题缺少关于文件夹实际包含内容的非常重要的细节,否则这是对特定问题的正确回答。除非要有一个子文件夹数组,否则不需要迭代子文件夹,递归将不必要地扰乱调用堆栈。