为什么Python的这个修改过的笛卡尔积函数不起作用?

时间:2016-02-11 18:27:30

标签: python product cartesian

理想情况下,输入为[1,2],输出为[[1,1],[2,2],[1,2],[2,1]]的所有组合。基本上,打印所有可能的替换组合。

def cart(lst):
   if lst == []:
      return [[]]

   return [x[i:] + [lst[0]] + x[:i] for x in cart(lst[1:]) for i in range(len(x)) ]

l = [1,2,3] 
print cart(l)

返回

  

[]

以更易读的形式,代码基本上是这样说的:

for x in cart(lst[1:]):
   for i in range(len(x)):
      return x[i:] + [lst[0]] + x[:i]

如果我们假设输入[1,2,3]的递归情况,那么 cart([2,3])应生成[[2,3], [3,2], [2,2], [3,3]],因此对于递归步骤,我们希望在每个可能的位置插入1。 (此代码可能缺少111案例。)

代码在逻辑上看似正确,但输出一个空字符串。

是否有遗漏或我是否错误地接近了问题?

修改

实际上,我意识到代码会稍微复杂一点:

def cart(lst):
    if len(lst) <= 1:
        return lst
    else:
        return [x[i:] + [lst[j]] + x[:i] for x in cart(lst[1:]) for j in range(len(lst)) for i in range(len(x))]

虽然这仍然奇怪地返回一个空列表。我的预感是我错过了一个基本案例。

修改

这与我的基本情况有关。修改后的代码:

def cart(lst):
    if len(lst) <= 1:
        return [lst]
    else:
        return [x[i:] + [lst[j]] + x[:i] for x in cart(lst[1:]) for j in range(len(lst)) for i in range(len(x))]

l = [1,2,3]
print cart(l)

但现在返回

  

[[3,2,1],[2,1,3],[3,2,2],[2,2,3],[3,2,3],[2,3,3] ],[3,3,1   ],[3,1,3],[3,3,2],[3,2,3],[3,3,3],[3,3,3]]

现在好了,虽然输出缺失了。似乎再次成为一个基本案例问题。

1 个答案:

答案 0 :(得分:0)

在这里找到答案 Algorithm for recursive function for permutations with replacement in python

def permutations_with_replacement(k,n):
         # special case (not part of recursion)
         if k == 0:
            return []

         if k == 1:
            return [[n[i]] for i in range(len(n))]

         else:
            # Make the list by sticking the k-1 permutations onto each number 
            # we can select here at level k    
            result = []
            # Only call the k-1 case once, though we need it's output n times.
            k_take_one_permutations = permutations_with_replacement(k-1,n)  

            for i in range(len(n)):
                for permutation in k_take_one_permutations:
                    result.append([n[i]]+permutation)   
            return result

         print permutations_with_replacement(3,2)

print permutations_with_replacement(3, [1,2,3])

看起来我试图采用列表本身的递归情况,而不是组合的大小。

我想知道解决方案是否可以在列表中重复出现,而不是组合的大小。