|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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)
复制代码
通过这样的修改,递归函数会在遇到重复序列时停止拼接,并返回最终的结果。
希望这可以帮助到你!如果还有其他问题,请随时提问。
|
|