Требуется больше помощи с рекурсивной функцией и возвращаемым значением - PullRequest
0 голосов
/ 05 ноября 2010

Я думаю, что рекурсия работает правильно, но я не могу установить правильное значение свойства первоначально запрошенного элемента.

Цель здесь - найти самого верхнего родителя (или "предка")., «глубина = 0» вложенного элемента (таксономия, основанная на атрибутах «родителя» словаря), и соответственно назначьте этому первоначально запрошенному свойству «предка» вложенного элемента.

Например, в

Яблоки
- Красный
- - Империя
- - - Fresh

Предок "Fresh" должен быть установлен в "Яблоки".

Пока япытаясь сделать это «по требованию» и индивидуально, я открыт для решения, которое помечает всех детей, связанных с одним и тем же предком, одним махом или для утверждения, поскольку это, вероятно, будет более эффективным.

ЗАПРОС

for (var mc:Object in taxonomy) {
        var term = taxonomy[mc];
        term["ancestor"] = getAncestor(term);
        trace("Setting " + term.name + "'s ancestor as [" + term.ancestor + "]");
        ... }

FUNCTION

function getAncestor(term:Object):String {

    var ancestor = "default";

    for(var obj:Object in taxonomy) {
        if(term.parent == taxonomy[obj].tid) { // If next object is current object's parent
            if(taxonomy[obj].depth == 0) { // And if object's parent is a root object
                // Then object's parent is the ancestor
                trace(term.name + "'s parent IS the root (" + taxonomy[obj].name + "). DONE."); // "term" here is NOT originally requested term
                return(taxonomy[obj].name); // Return DIRECTLY to function call and assign originally requested term with this name.
                break; // Get the hell out of here
            }
            else { // If object's parent is not a root object
                trace(term.name + "'s parent (" + taxonomy[obj].name + ") is NOT a root. LOOPING.");
                getAncestor(taxonomy[obj]); // Step function again with current object's parent object as current object
            }
        }
    }
    return(ancestor);
}

Наконец, вот фрагмент трассируемого вывода, основанного на моих многочисленных отладкахзаявления:

родитель лечения (Еда Дисортировщики) это не рут.LOOPING.
Родитель расстройства пищевого поведения (психосоматический) НЕ является корнем.ПЕТЛЯ.
Родитель психосоматика (Болезнь / Болезнь) НЕ является корнем.LOOPING.
Родитель Болезни / Болезни (Личный) НЕ является корнем.LOOPING.
Родитель Personal (Здоровье) НЕ является пользователем root.LOOPING.
Родителем здоровья является корень (Люди).СОВЕРШЕНО.
Установка предка обработки как [по умолчанию]

Как вы можете видеть, хотя рекурсия не находит корень, первоначально запрошенный элемент по-прежнему получает значение по умолчанию.Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2010

Может быть, я что-то упускаю, но я не понимаю, почему для этого нужно использовать рекурсию. Внутри обычной функции просто перебирайте родительские объекты цели, пока не найдете тот, который является корнем, а затем установите предка Fresh на это.

0 голосов
/ 05 ноября 2010

Я предполагаю, что в этом операторе else вы хотите:

ancestor = getAncestor(taxonomy[obj]);

Прямо сейчас вы вызываете рекурсию, но ничего не делаете с возвращаемым значением, поэтому вы никогда не обновляете переменную-предка.

Кроме того, что break после оператора return довольно бессмысленно.:)

Если я правильно понимаю вещи, вы действительно можете сделать:

return getAncestor(taxonomy[obj]);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...