【问题标题】:How do I convert this iterative function to a recursive one?如何将此迭代函数转换为递归函数?
【发布时间】:2021-11-03 06:42:50
【问题描述】:

此函数将输入字符串映射到字典中的字符串,并输出结果。知道如何递归处理吗?

def dna(seq):
    hashtable = {'A': 'U', 'G': 'C', 'T': 'A', 'C': 'G'}
    ans = ''
    for i in range(len(seq)):
        ans += hashtable[seq[i]]
    return ans


print(dna('AGCTGACGTA'))

谢谢。

【问题讨论】:

  • 理论上,任何迭代都可以重写为递归。在实践中,Python 不是很擅长,在这种情况下迭代方法更可取;递归没有任何好处。这段代码可以改进(for ch in seq,或者使用理解,或者最好使用str.translate),但是你目前拥有的仍然比递归好得多。

标签: python dictionary recursion hashmap iteration


【解决方案1】:

你可以这样做:

def dna(seq):
    if not seq:
        return ''
    return {'A': 'U', 'G': 'C', 'T': 'A', 'C': 'G'}[seq[0]] + dna(seq[1:])

虽然这几乎可以肯定会更慢,使用更多内存,并且会达到 Python 的递归限制。几乎所有用例的推荐方法都是迭代的;修改您的代码以使用 Python 的内置字符串连接:

def dna(seq):
    hashtable = {'A': 'U', 'G': 'C', 'T': 'A', 'C': 'G'}
    ans = []
    for elem in seq:
        ans.append(hashtable[elem])
    return ''.join(ans)

【讨论】:

    【解决方案2】:

    你应该明白递归并不总是答案。

    python 中有一个最大递归深度,您可以更改它。但是你仍然会有一个限制。见:https://stackoverflow.com/a/3323013/2681662

    允许的最大递归深度:

    import sys
    print(sys.getrecursionlimit())
    

    所以在你的情况下迭代方法更好。

    还是让我们看看递归版本的样子。

    对于递归函数,您必须遵循简单的规则:

    1. 创建退出条件
    2. 再次调用自己(函数)。
    def dna_r(seq):
        hashy = {'A': 'U', 'G': 'C', 'T': 'A', 'C': 'G'}
        if len(seq) == 1:
            return hashy[seq]
    
        return dna_r(seq[0]) + dna_r(seq[1:])
    

    【讨论】:

    • 提前道歉,但是作为一个对递归非常陌生的人,我可以问一下为什么当 dna_r(first letter) 满足基本情况时,循环不只是在第一个循环中结束?
    • 实际上它在函数调用dna_r(first letter)作为第一个字母时结束。但是我们使用dna_r(seq[1:])再次调用该函数以获取剩余的字母。
    猜你喜欢
    • 2020-08-20
    • 2021-07-06
    • 2014-03-01
    • 2020-05-08
    • 2020-08-08
    • 2015-05-30
    相关资源
    最近更新 更多