Recursion 不定义树结构的递归树和

Recursion 不定义树结构的递归树和,recursion,tree,sum,Recursion,Tree,Sum,我有一个节点和子节点的字典(1)和一个与每个节点关联的权重列表(2)。字典可以解释如下:例如:键1的值为3,4,这意味着节点id=1是节点3和4的父节点。键3的值为5,6,8,这意味着节点id=3是节点5,6和8的父节点。。。等等。第二个列表只是一个权重列表,其中索引表示权重关联的节点id 我想计算列表(1)中每个关键节点的所有子节点权重之和 我认为这个问题类似于递归树求和,尽管我的列表没有设置为树结构 我应该如何继续?这里是您想要实现的解决方案的Python版本: dctNodeIDs_vs_

我有一个节点和子节点的字典(1)和一个与每个节点关联的权重列表(2)。字典可以解释如下:例如:键1的值为3,4,这意味着节点id=1是节点3和4的父节点。键3的值为5,6,8,这意味着节点id=3是节点5,6和8的父节点。。。等等。第二个列表只是一个权重列表,其中索引表示权重关联的节点id

我想计算列表(1)中每个关键节点的所有子节点权重之和

我认为这个问题类似于递归树求和,尽管我的列表没有设置为树结构


我应该如何继续?

这里是您想要实现的解决方案的Python版本:

dctNodeIDs_vs_Childs = {}
dctNodeIDs_vs_Childs[1] = (2,3,4)
dctNodeIDs_vs_Childs[2] = (13,14,15)
dctNodeIDs_vs_Childs[3] = (5,6,7,8)
dctNodeIDs_vs_Childs[4] = (9,10,11,12)
lstNodeIDs_vs_Weight = [None,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

def getSumOfWeights(currNodeID, lstNodeIDs_vs_Weight = lstNodeIDs_vs_Weight, dctNodeIDs_vs_Childs = dctNodeIDs_vs_Childs):
    sumOfWeights = 0
    print("#currNodeID", currNodeID)
    if currNodeID not in dctNodeIDs_vs_Childs:
        sumOfWeights += lstNodeIDs_vs_Weight[currNodeID]
    else: 
        for childNodeID in dctNodeIDs_vs_Childs[currNodeID]:
            print("## childNodeID", childNodeID)
            if childNodeID not in dctNodeIDs_vs_Childs:
                sumOfWeights += lstNodeIDs_vs_Weight[childNodeID]
            else:
                sumOfWeights += lstNodeIDs_vs_Weight[childNodeID] + sum( [ getSumOfWeights(nodeID) for nodeID in dctNodeIDs_vs_Childs[childNodeID] ] )
    return sumOfWeights

lstNodeIDs_vs_WeightsOfChildNodes = [None for _ in range(len(lstNodeIDs_vs_Weight)+1)]       
for nodeID in dctNodeIDs_vs_Childs.keys():
    print("nodeID =", nodeID)
    lstNodeIDs_vs_WeightsOfChildNodes[nodeID] = getSumOfWeights(nodeID)
print("---")
print(lstNodeIDs_vs_WeightsOfChildNodes)
其输出如下:

nodeID = 1
#currNodeID 1
## childNodeID 2
#currNodeID 13
#currNodeID 14
#currNodeID 15
## childNodeID 3
#currNodeID 5
#currNodeID 6
#currNodeID 7
#currNodeID 8
## childNodeID 4
#currNodeID 9
#currNodeID 10
#currNodeID 11
#currNodeID 12
nodeID = 2
#currNodeID 2
## childNodeID 13
## childNodeID 14
## childNodeID 15
nodeID = 3
#currNodeID 3
## childNodeID 5
## childNodeID 6
## childNodeID 7
## childNodeID 8
nodeID = 4
#currNodeID 4
## childNodeID 9
## childNodeID 10
## childNodeID 11
## childNodeID 12
---
[None, 119, 42, 26, 42, None, None, None, None, None, None, None, None, None, None, None, None]

工作中的一位同事提出了这个优雅的解决方案(需要两本字典)。但这可能不是最有效的方法


double-MethodName(int-Id)=>FirstDic.ContainsKey(Id)?FirstDic[Id].Sum(n=>MethodName(n)):SecondDic.Where(y=>y.Key==Id).选择(x=>x.Value).Sum()

欢迎来到StackOverflow。请阅读并遵循帮助文档中的发布指南。在这里申请。StackOverflow不是设计、编码、研究或教程服务。您应该如何继续?选择一种编程语言并编写代码求和(如果需要),或者直接手工编写:)。是的,如果您选择编写代码的路径来计算和,那么这种问题非常适合递归机制。@Prune,我将在将来尝试提出更好的问题。谢谢