理想情况下,输入为[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]]
现在好了,虽然输出缺失了。似乎再次成为一个基本案例问题。
答案 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])
看起来我试图采用列表本身的递归情况,而不是组合的大小。
我想知道解决方案是否可以在列表中重复出现,而不是组合的大小。