我有一个二进制树:
root
/
g h
/ /
d a e f
/
b c
每个节点都有"seq"特征,它存储每个节点的dna序列('AACCGGT')
同为叶子的姐妹(b,c和e,f)各得一分(float)我想要的是:
- 将有分数的叶子的分数与它的妹妹b分数与c分数进行比较
d.score=最大值(b.score,c.score)
e、f和h 相同
- 将a.seq与d.seq===>d和e进行比较会得到分数
- g.score max(e.score,a.score)…直到到达根NOte:每个叶节点都有"模型特征"我根据b.model===>比较b.seq和c.seq我得到了b.score,然后根据c.model===>我得到了c.score
这是我写的函数,但我不确定它是否符合我的要求,我无法测试它,因为我还没有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
l
有人能告诉我是否在考虑写作吗?注意,这是我第一次使用树数据结构和递归提前感谢您的任何建议
好的,让我们试着回顾一下递归。
执行递归函数时要写的第一件事是"退出条件"(在某个时刻终止递归的东西)。在您的情况下,退出条件应该指的是树的叶节点,它可能类似于:
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)
那么你也想要一个特殊的条件,因为它没有任何姐妹:
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(),它是应该比较两个序列的方法,并且可能会根据您的代码进行调整。但从理论上讲,这应该是几乎正确的。