2014-01-20 49 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 –

相关问题