我制作了一个突变函数,可以在 1% 的时间内更改字符串中的每个字符。为此,我创建了一个辅助函数,从列表中选择一个字符并将其替换到旧字符的位置。然而,在选择的新字符与要替换的旧字符匹配的情况下,突变函数应该将旧字符插入两次。这使事情变得棘手,因为我不能再只迭代字符串,因为它可能会随着迭代而增长。为了解决这个问题,我使突变函数递归。其代码如下:
import sys
from numpy import random
from random import randrange
sys.setrecursionlimit(100000)
def PickRandomOtherBase(base_character):
bases = ['A', 'C', 'G', 'T', '-']
new_character = bases[randrange(0, len(bases))]
if new_character == base_character.upper():
return new_character + base_character.upper()
else:
return new_character
def AddMutations(sequence_string, mutation_rate=0.01):
# base case
if not sequence_string:
return ''
# otherwise
rng = random.default_rng()
m_flag = rng.binomial(1, mutation_rate)
current_char = sequence_string[0]
if m_flag:
current_char = PickRandomOtherBase(current_char)
return ''.join([current_char, AddMutations(sequence_string[1:], mutation_rate=mutation_rate)])
AddMutations('acgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctgaacgcgacgttggttaaccttaaacccgggttttgggtttgccaccgctga',
mutation_rate=1)
这适用于小字符串,但对于大字符串,它会返回以下错误:
RecursionError: maximum recursion depth exceeded in comparison
我使用
sys.setrecursionlimit(100000)
设置递归限制。
我通过反复试验发现,无论我将递归限制设置多高,如果输入字符串高于大约 2150 个字符,该函数都不会返回任何内容。
在这一点上,我想我可以重写这段代码,使其不递归,但我很困惑为什么这不起作用。我不认为内存成本会如此之高以至于根本无法运行,并且无声的故障并没有给我太多的故障排除方式。
当我尝试用长字符串打印函数输出时,它什么也不打印。 似乎这里也发生了无声故障,因为当我尝试打印任何内容时,即使是在长字符串上调用此函数后的字符串“foo”,也不会打印任何内容。
无法重现,但这里有一个迭代解决方案:
from numpy import random
from random import choice
import sys
bases = 'ACGT-'
rng = random.default_rng()
def PickRandomOtherBase(base_character):
new_character = choice(bases)
if new_character == base_character:
return base_character * 2
else:
return new_character
def AddMutations(sequence_string, mutation_rate=0.01):
result = list(sequence_string.upper()) # Use a mutable list
for i, c in enumerate(result):
m_flag = rng.binomial(1, mutation_rate)
if m_flag:
result[i] = PickRandomOtherBase(c) # mutate
return ''.join(result)