2016-01-09 30 views
0

我做了一個遞歸函數,它採用二進制代碼,應該轉換爲字母「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,"") 
+0

問題尋求幫助調試必須包括所期望的行爲,*(** ** 「爲什麼不是這個代碼工作的?」)一個特定的問題或錯誤*和*在問題本身**中重現它的最短代碼*。沒有**明確問題陳述**的問題對其他讀者沒有用處。請參閱:[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – MattDMo

+0

你有一個錯字。當你檢查「C」時,你必須做'elif e [i:i + 2] =='00':'並在隨後的調用'numeros(i + 2,f)'中。這也沒有必要做遞歸。它可以用相同的邏輯迭代地完成。您正在有效解碼前綴代碼。 – Reti43

回答

1

沒有進入該方法的優點,並簡單地看問題(缺乏遞歸),我建議現在是時候開始尋找調試技術和工具的好時機。看看the python debugger或者簡單地添加一些打印語句,以便您可以瞭解代碼中發生的情況可能是值得的。

至少,當你有一個if/elif鏈它總是一個好主意,有一個else在底部,即使你從來沒有想到的代碼到那裏,打印出一個消息或引發異常,表明東西意外發生了。如果你這樣做,你會發現你的elif錯誤導致代碼無法進入任何遞歸調用,你需要仔細檢查你的條件測試。

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