python递归与冒泡排序

时间:2013-11-18 21:00:02

标签: python recursion bubble-sort

所以,我有这个问题,我收到两串字母ACGT,一个只有字母,另一个包含字母和短划线“ - ”。两者都是相同的长度。将带有破折号的字符串与没有它的字符串进行比较。细胞细胞。对于每个配对我都有一个评分系统。我为评分系统编写了这段代码: 例如: dna1:-ACA dna2:TACG 得分为-1。 (因为破折号与字母(T)相比给出-2,字母与同一字母相比给出+1(A到A),+ 1(C到C)和非相似字母给(-1)所以sum是-1。

def get_score(dna1, dna2, match=1, mismatch=-1, gap=-2):
""""""

score = 0

for index in range(len(dna1)):
    if dna1[index] is dna2[index]:
        score += match
    elif dna1[index] is not dna2[index]:
        if "-" not in (dna1[index], dna2[index]):
            score += mismatch
        else:
            score += gap

这很好。

现在我必须使用递归来为2个字符串提供最佳分数。 我收到2根琴弦,这次可以有不同的尺寸。 (我不能改变字母的顺序)。 所以我写了这个代码,在短字符串中添加“ - ”多次,以创建2个相同长度的字符串,并将它们放在列表的开头。现在我想开始移动破折号并记录每个破折号位置的得分,最后获得最高的posibble分数。因此,为了移动破折号我写了一个小泡泡排序..但它似乎做我想要的东西。我意识到这是一个很长的问题,但我会喜欢一些帮助。如果我写的任何内容都不被理解,请告诉我。

def best_score(dna1, dna2, match=1, mismatch=-1, gap=-2,\
                         score=[], count=0):
""""""

diff = abs(len(dna1) - len(dna2))

if len(dna1) is len(dna2):
    short = []
elif len(dna1) < len(dna2):
    short = [base for base in iter(dna1)]
else:
    short = [base for base in iter(dna2)]

for i in range(diff):
    short.insert(count, "-")

for i in range(diff+count, len(short)-1):
    if len(dna1) < len(dna2):
        score.append((get_score(short, dna2),\
                      ''.join(short), dna2))
    else:
        score.append((get_score(dna1, short),\
                      dna1, ''.join(short)))
    short[i+1], short[i] = short[i], short[i+1]

if count is min(len(dna1), len(dna2)):
    return score[score.index(max(score))]
return best_score(dna1, dna2, 1, -1, -2, score, count+1)

1 个答案:

答案 0 :(得分:0)

首先,如果我正确地推断了你的成本函数,你的最佳得分值不依赖于差距,因为破折号的数量是固定的。

其次,它是线性的,取决于不匹配的数量,因此不依赖于匹配和不匹配的精确值,只要它们分别为正和负。

因此,您的任务减少为查找最长字符串字母的最长子序列,严格匹配最短字母的子序列。

第三,通过M(string, substr)函数定义返回上面最佳匹配的长度。如果你最小的字符串fisrt字母是S,那就是substr == 'S<letters>',那么

M(string, 'S<letters>') = \
    max(1 + M(string[string.index(S):], '<letters>') + # found S
            M(string[1:], '<letters>')) # letter S not found, placed at 1st place

后者是一个易于实现的递归表达式。

对于一对string, substr表示m=M(string, substr)最佳得分相等

m * match + (len(substr) - m) * mismatch + (len(string)-len(substr)) * gap

直截了当,在递归表达式中存储最大值,找到最匹配的是什么。