我使用递归函数来修改字符串,但如果字符串太大,函数不会返回任何内容

问题描述 投票:0回答:1

我制作了一个突变函数,可以在 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”,也不会打印任何内容。

python string recursion silent
1个回答
0
投票

无法重现,但这里有一个迭代解决方案:

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)
© www.soinside.com 2019 - 2024. All rights reserved.