使用递归将二进制代码解码为字母

时间:2016-01-09 22:18:39

标签: python recursion

我做了一个递归函数,它接受二进制代码,并且应该转换为字母“A”,“T”,“C”和“G”。

然后在这里,它应该将该二进制代码分配给下面相应的字母,但它不会超过第一个字母。你们中的任何人可以帮我解决这个问题吗?

def numeros(i,f):
    e="100101"
    if i >=len(e):
        print f
    else:
         if e[i:i+1]=="1":
            f=f+"G"
            print f
            numeros(i+1,f)
         elif e[i:i+3]=="011":
            f=f+"T"
            print f
            numeros( i+3,f)
         elif e[i:i+3]=="010":
            f=f+"A"
            print f
            numeros( i+3,f)
         elif e[i:i+3]=="00":
            f=f+"C"
            print f
            numeros( i+3,f)

numeros(0,"")

2 个答案:

答案 0 :(得分:1)

没有深入研究这种方法的优点,只是简单地看一下问题(没有递归),我建议现在是开始研究调试技术和工具的好时机。可能值得查看the python debugger,或者只是添加一些打印语句,以便了解代码中发生了什么。

至少当你有一个if/elif链时,在底部有一个else总是一个好主意,即使你从未期望代码到达那里,也是打印出一条消息或引发异常,表明发生了意外事件。如果您这样做,您会发现elif中的错误导致代码无法进入任何递归调用,您需要仔细检查条件测试

答案 1 :(得分:0)

递归不适合这个问题,并且会在超过1000个令牌长度的任何输入字符串上崩溃(== Python的调用堆栈的默认深度)。

我建议改为:

CODES = {
    "1"  : "G",
    "00" : "C",
    "010": "A",
    "011": "T"
}

def decode(string):
    token = ""
    message = []
    for digit in string:
        token += digit
        if token in CODES:
            message.append(CODES[token])
            token = ""
    return "".join(message)

给出了

>>> print(decode("100101"))
GCG