马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
例如,AAATAAA和CCCGAAA,k=3,分别首尾3个字符一样,则拼接之后为CCCGAAATAAA
想实现递归功能,当拼接一次后发现拼接后的结果仍可再次拼接则再拼一次# 读文件的函数
def readfasta(lines):
illustrate = []
seq = []
string = ""
num = 0
for i in lines:
# 判断是否为说明行
if '>' in i or ';' in i:
newi = i.replace('>','').replace(';','').replace('\n','')
illustrate.append(newi)
if num != 0:
seq.append(string)
string = ""
else:
news = i.replace('\n','')
string += news
num += 1
if num == len(lines):
seq.append(string)
return illustrate,seq
f = open('12fasta.txt', 'r')
lines = f.readlines()
f.close()
(i, s) = readfasta(lines)
print(i,s)
k = int(input("输入K值:"))
dic = {}
# 拼接函数
def getoriginal(seq,illu,k):
x = 0
for n,m in enumerate(seq):
temp = m[-k:]
for i,j in enumerate(seq):
if i != n:
if temp == j[:k]:
name = illu[n] + " " + illu[i]
newstr = m[:-k] + j
dic.update({name:newstr})
x += 1
seq = list(dic.values())
illu = list(dic.keys())
print(seq,illu)
if len(illu) == 1 or x == 0:
return dic
else:
return getoriginal(seq,illu,k)
res = getoriginal(s,i,k)
print("\n",res)
测试用例如下:
>Rosalind_0498
AAATAAA
>Rosalind_2391
AAATTTT
>Rosalind_2323
TTTTCCC
>Rosalind_0442
AAATCCC
>Rosalind_5013
GGGTGGG
>Rosalind_123
AAAGAAA
你的问题是关于序列拼接的递归函数,你想知道为什么测试用例会造成死循环。
根据你提供的测试用例,我发现其中有两个序列是相同的,即AAATAAA和AAAGAAA。这意味着无论你如何拼接它们,都会得到相同的结果,即AAATAAA或AAAGAAA。因此,递归函数会一直尝试拼接这两个序列,但永远无法达到退出条件,从而导致死循环。
为了避免这种情况,你可以在递归函数中添加一个判断条件,检查是否有重复的序列出现在seq中。如果有,就跳过拼接操作,直接返回dic。修改后的代码如下所示:
# 拼接函数
def getoriginal(seq, illu, k):
x = 0
dic = {}
# 检查是否有重复的序列
if len(seq) != len(set(seq)):
return dic
for n, m in enumerate(seq):
temp = m[-k:]
for i, j in enumerate(seq):
if i != n:
if temp == j[:k]:
name = illu[n] + " " + illu[ i]
newstr = m[:-k] + j
dic.update({name: newstr})
x += 1
seq = list(dic.values())
illu = list(dic.keys())
print(seq, illu)
if len(illu) == 1 or x == 0:
return dic
else:
return getoriginal(seq, illu, k)
res = getoriginal(s, i, k)
print("\n", res)
通过这样的修改,递归函数会在遇到重复序列时停止拼接,并返回最终的结果。
希望这可以帮助到你!如果还有其他问题,请随时提问。
|