Итак, у меня есть данные, хранящиеся в 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)