Почему моя рекурсивная функция перебирает дочерние узлы несколько раз? - PullRequest
0 голосов
/ 10 мая 2019

Итак, у меня есть данные, хранящиеся в CSV-файле, который описывает древовидную структуру.

Каждая строка имеет: ID узла, имя узла, имя родителя узла.

Например:

fma0000     Thing                   fma0000
fma85802    FMA attribute entity    fma0000
fma85803    Physical state value    fma85802
fma85805    Liquid value            fma85803

Обратите внимание, что первая строка имеет одинаковый идентификатор для 1-го и 3-го столбца: корень дерева является его собственным родителем.

Каждый идентификатор узла связан споддерево, которое имеет этот идентификатор как корень в словаре.Поддеревья - это экземпляры класса Tree, который я определил, пример здесь:

<Node_ID: fma0000, Name: Thing, Parent: fma0000, Children: ['fma85802'], Number_of_descendants: 14>

Моя проблема связана с рекурсивной функцией, которая вычисляет Number_of_descendants каждого поддерева.

Она выполняется, но с моиммаленькие тестовые данные (маленькое дерево с 15 узлами) возвращают слишком много потомков для каждого поддерева.При использовании отладчика VS я обнаружил, что функция проходит через каждый узел несколько раз.

Я до сих пор не понимаю, почему.

Код функции здесь:

def calculate_nber_descendants(start):

    global step_counter
    current_obj = test_dict[start]


    if (current_obj.Children!= []):                  ## If current node has 
        for child in current_obj.Children:           ## children, call function     
        calculate_nber_descendants(child)            ## for each child.

    if (current_obj.enfants == []):                  ## If terminal node:
        setattr(current_obj, 'nbDescendants', 0)     ## bump node's parent
                                                     ## 'Number_of_descendants'
    value = 0                                        ## attribute
    value = getattr(test_dict[current_obj.Parent], 'Number_of_descendants') + getattr(current_obj, 'Number_of_descendants') + 1
    setattr(test_dict[current_obj.Parent], 'Number_of_descendants', value)



    step_counter += 1
    if (step_counter == len(test_dict)):
        return 'All nodes analyzed.'
    else:   
        print(step_counter)


test_start = 'fma0000'

test1 = calculate_nber_descendants(test_start)

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