2014-01-20 50 views
0

給定的是長度爲n的二進制字符串的列表,其中一些是代碼字。檢查是否對所有列表元素的所有元素都滿足某些屬性

內部主程序如果滿足一些條件,我想將一個元素添加到代碼字列表中。算法的相關部分可以寫成:從列表開始,只有一個碼字添加元素到這個列表(從所有可能的字符串列表中),如果它距離第一個碼字至少有d,那麼爲了添加接下來我們必須在原始列表中找到第一個這樣的字符串,與這兩個已經添加的碼字的距離至少爲d。第四個元素也是如此 - 距離已經找到的代碼字應該是至少d。等等...

使用遞歸,我寫了下面的代碼,這與結尾:

我在做什麼錯「RuntimeError最大遞歸深度,同時調用Python對象超標」? (我是一個新手蟒)

def helper(n,d,strings,codes,lastIndex): 
    for i in range(lastIndex,n): 
     distanceCheckSatisfied = True 
     for j in range(len(codes)): 
      if (not(hammingDistance(codes[j],strings[i]) >= d) or not(distanceCheckSatisfied)): 
       distanceCheckSatisfied = False 
      if (distanceCheckSatisfied): 
       codes.append(strings[i]) 
       helper(n,d,strings,codes,i) 
       break; 
       break; 

回答

2

你的第二個break將永遠不會達到 - Python的break聲明立即爆發的最裏面forwhile循環。這意味着你的外部for循環仍在運行。

修復應該擺脫大量的遞歸調用。

在一個半相關,風格引導話題:

  • 你不應該在Python中使用分號。
  • 針對if語句的條件附加的括號是不必要的,應該避免使用它們,除非您使用它們將條件分散到多行。
  • not是一個操作員,而不是一個功能 - 使用not x,而不是not(x)
+0

非常感謝您的輸入(和代碼造型)......然而,即使去除二度破發似乎並沒有被工作(這就是爲什麼我說這畢竟) –

+0

當然除去第二'突破「沒有任何改變 - 它從來沒有執行過。它看起來像你想打破最頂級的循環,這相當於打破了功能。用'return'語句替換你的兩個'break'。 –

+0

這種遺憾的是不工作,要麼。對於第一個函數調用什麼工作是下面的代碼:在範圍 \t爲I(N): \t \t如果(漢明距離(代碼[0],字符串[1]) > = d): \t \t \t codes.append(strings [i]) \t \t \t break –

相關問題