2016-06-29 3 views
0

Предположим, у меня есть:решение с рекурсивной функцией

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

Как я могу отобразить иерархию папки, при условии, что я не знаю, сколько подпапки там. Например:

  1. FolderA содержит FolderB (2 уровня)
  2. FolderA содержит FolderB, который содержит FolderC (3 уровня).

Я ищу алгоритмическое решение с использованием рекурсивной функции. Это моя попытка:

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

Я не знаю, может быть, если у вас есть подпапка, вы должны спросить эту подпапку для отображения? – Will

+0

Мне нужно отобразить имя родительского имени FolderA -> имя папки FolderB -> имя папки (имя родительской папки -> имя дочерней папки -> имя дочернего имени ребенка). Не обязательно трехуровневая иерархия, это может быть 5, 6 или более. –

+0

Вы никогда не перебираете детей из 'f'. Вы должны сделать это, чтобы узнать все подпапки. – Vesper

ответ

2

Если я правильно истолковал ваш вопрос, похоже, что у вас есть связанный список, в котором у каждого родителя есть только один ребенок. В этом случае, он может быть более эффективным, чтобы избежать рекурсии полностью (хотя это было бы труднее расширить до множественных потомков позже. Рекурсия более расширяемой для этого, я думаю.)

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

Основные преимущества это то, что независимо от того, насколько велик связанный список, объем памяти, хранящейся для вычислений, остается постоянным. Однако рекурсивная стратегия потребляет все больше пространства стека, когда оно рекурсивно.

+0

Если вопрос не содержит очень важных сведений о том, что содержит папка, это правильный ответ на конкретный вопрос. Если у вас не будет массива подпапок, вам не нужно перебирать подпапки, и рекурсия излишне загромождает ваш стек вызовов. – Omnilord

3

Простое рекурсивное решение:

public void printHierarchy(Folder f){ 
    if(f == null) { 
     return; 
    } 
    f.display(); 
    printHierarchy(f.subFolder);   
} 
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 содержит B и D, B содержат C

Вы могли бы заменить пространство "--", "**" или что вы хотите.