[英]python recursion with 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)
首先,如果我正確地推斷了您的成本函數,您的最佳得分值不依賴於差距,因為破折號的數量是固定的。
其次,它是線性的,取決於不匹配的數量,因此不依賴於匹配和不匹配的精確值,只要它們分別為正和負。
因此,您的任務減少為查找最長字符串字母的最長子序列,嚴格匹配最短字母的子序列。
第三,通過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=M(string, substr)
相等
m * match + (len(substr) - m) * mismatch + (len(string)-len(substr)) * gap
它很簡單,在遞歸表達式中存儲最大值,以找出最匹配的是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.