为什么我的递归函数遍历子节点的多个时间?

时间:2019-05-10 13:51:07

标签: python recursion tree

因此,我将数据存储在一个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)

0 个答案:

没有答案