通常我对这种类型的东西很好,但这对我很不满意。我上周必须编写这个函数,并且递归地编写它是最有意义的,尽管现在我正在尝试找到一种方法来迭代将它合并到我正在编写的另一个函数中。这是函数的递归版本,
def XXX (x,y,z):
if z[x][0][0] != z[y][0][0]:
XXX(z[x][0],z[y][0],z)
else:
return z[x][0]
这是数据结构
{'A': [('AD', 4.0), None, None], 'C': [('ADBFGC', 14.5), None, None], 'B': [('BF', 0.5), None, None], 'E': [('ADBFGCE', 17.0), None, None], 'D': [('AD', 4.0), None, None], 'G': [('BFG', 6.25), None, None], 'F': [('BF', 0.5), None, None], 'ADBFG': [('ADBFGC', 6.25), ('AD', 4.25), ('BFG', 2.0)], 'BF': [('BFG', 5.75), ('B', 0.5), ('F', 0.5)], 'ADBFGC': [('ADBFGCE', 2.5), ('ADBFG', 6.25), ('C', 14.5)], 'ADBFGCE': [None, ('ADBFGC', 2.5), ('E', 17.0)], 'BFG': [('ADBFG', 2.0), ('BF', 5.75), ('G', 6.25)], 'AD': [('ADBFG', 4.25), ('A', 4.0), ('D', 4.0)]}
我完全对此有所了解,任何帮助都会受到赞赏:)
答案 0 :(得分:1)
def ClosestCommonAncestor(otu1, otu2, tree):
while tree[otu1][0][0] != tree[otu2][0][0]:
otu1,otu2,tree = tree[otu1][0],tree[otu2][0],tree
return tree[otu1][0]
请注意,应该可以为递归版本添加功能。我还建议定义一个Tree(*children)
类来使事情更清楚。
答案 1 :(得分:1)
def ClosestCommonAncestor (otu1,otu2,tree):
while True:
a = tree[otu1][0]
b = tree[otu2][0]
if a[0] == b[0]:
return a
otu1 = a
otu2 = b