我有一棵二叉树:
root
/ \
g h
/ \ / \
d a e f
/ \
b c
每个节点都有'seq'功能,用于存储每个节点('AACCGGT')
d.score = max(b.score,c.score)
同样适用于e,f和h
我写的这个函数但是我不确定它是否符合我的要求而我无法测试它因为我还没有align_trna函数
def affect_score(n):
if (n.score)==0:
n.score,n.model=affect_score(n.get_children()[0])
result=n.score
model=n.model
if not n.is_root():
sis=n.get_sisters()[0]
if sis.score==0:
sis.score,sis.model=affect_score(sis.get_children()[0])
n.score=align_trna(n.seq,sis.seq,n.model)
sis.score,sis.model= align_trna(nseq, sis.seq,sis.model)
if n.score < sis.score:
result=sis.score
model=sis.model
return result,mode
1
任何人都可以通过告诉我是否在想写作来帮助我吗? 请注意,这是我第一次使用树数据结构和递归 提前感谢任何建议
答案 0 :(得分:2)
好的,让我们回顾一下有关递归的事情。
执行递归函数时要写的第一件事是“退出条件”(在某些时候终止递归的东西)。 在您的情况下,退出条件应该引用树的叶节点,它将类似于:
if len(n.get_childreen())==0:
return n.score
然后对于每个其他节点,你应该进行计算:
child_score = max(affect_score(n).get_children()[0], affect_score(n).get_children()[1])
seq = compare_seq(n.seq, n.get_sisters()[0].seq)
n.score = max(child_score, seq)
然后你也想在root上有一个特殊条件,因为它没有任何姐妹:
if n.is_root():
n.score = max(affect_score(n).get_children()[0], affect_score(n).get_children()[1])
最后应该看起来像:
def affect_score(n):
if len(n.get_childreen())==0:
return n.score
if n.is_root():
n.score = max(affect_score(n).get_children()[0], affect_score(n).get_children()[1])
else:
child_score = max(affect_score(n).get_children()[0], affect_score(n).get_children()[1])
seq = compare_seq(n.seq, n.get_sisters()[0].seq)
n.score = max(child_score, seq)
这就是我理解你想做的事情!您需要添加compare_seq(),这是应该比较两个序列的方法,并可能适应您的代码。但理论上它应该几乎是正确的。