n维遍历

时间:2011-12-08 13:43:43

标签: python traversal n-dimensional

我正在实现n维的最长公共子序列。当前问题:如何遍历n个字符串?简单地嵌套for循环将不再起作用,因为我需要其中的n个。这个问题的解决方案是什么?我想,循环+递归,但究竟是怎么回事?我不是要求完整的算法,而只是如何生成动态编程算法的所有组合。 2D中的示例:

for position, char in word0:
  for position1, char1 in word1:
    # code here

2 个答案:

答案 0 :(得分:2)

如果你不想通过递归来做, 你可以实现n嵌套的“for”循环,就像这样 (不过,“for”循环不再是for循环):

i是索引数组 m是每个i的上限数组 iii索引(range(n)

的索引
n=4 # just an example
m=[3 for ii in range(n)] # just an example

i=[0 for ii in range(n)]
while True:
  print " ".join(["%2d"%x for x in i])
  for ii in range(n-1,-1,-1):
    i[ii] +=1
    if i[ii]<m[ii]: break # index i[ii] has not yet reached its individual max. value
    i[ii] = 0
  if sum(i)==0: break # all indices have counted to max. value 

答案 1 :(得分:1)

这类似于计数,例如,从0000到9999,其对应于四个单词,每个单词十个字母:00-002>&gt; 0002-&gt; ......-&gt; 0009-> 0010 - &gt; ...在每个阶段,你增加最后一个数字,当它翻过来时你增加前一个数字等,直到第一个数字翻转你完成为止。

这里有一种方法可以将计数封装在迭代器中:

def count(limits):
    idcs = [0] * len(limits)
    while True:
        yield tuple(idcs)
        for n in range(len(limits)-1, -1, -1):
            idcs[n] += 1
            if idcs[n] != limits[n]:
                break
            elif n == 0:
                raise StopIteration
            else:
                idcs[n] = 0

words = ['foo', 'bar', 'xyzzy']
for idcs in count(map(len, words)):
    chars = map(lambda w, i: w[i], words, idcs)
    print idcs, chars