因此,我将数据存储在一个csv文件中,该文件描述了树形结构。
每行都有:节点的ID,节点的名称,节点的父节点的名称。
例如:
fma0000 Thing fma0000
fma85802 FMA attribute entity fma0000
fma85803 Physical state value fma85802
fma85805 Liquid value fma85803
请注意,第一行和第三列具有相同的ID:树的根是其自己的父级。
每个节点ID与在字典中以该ID为根的子树相关联。 子树是我定义的Tree类的实例,例如:
<Node_ID: fma0000, Name: Thing, Parent: fma0000, Children: ['fma85802'], Number_of_descendants: 14>
我的问题是使用递归函数来计算每个子树的Number_of_descendant。
它执行了,但是使用我的小测试数据(一个有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)