【发布时间】:2018-09-16 16:21:58
【问题描述】:
我想创建一个递归算法来生成所有排列
具有一定长度的整数列表的指定长度n。
以下是我的想法:
对于列表中的每个元素,我可以将其删除,然后让我的递归函数将所有长度为k-1 的排列返回给我,然后将删除的数字添加到每个排列中。然后对列表中的所有数字重复此过程。
基本情况是列表为空或仅包含一个元素。
在这些情况下,我只返回列表。也就是说,只要 k 小于或等于列表的长度(例如,如果 k 是 3,但 l = [1,2],我不能产生任何长度排列 k)。
这是我写的:
def permutations(l, k):
w = len(l)
if (k <= w): # list is bigger than the length each permutations
if (w <= 1):
return list(l)
else:
result = []
for element in l:
listSmaller = l[:element] + l[element+1:]
for perm in permutations(listSmaller, k-1):
result.append([perm] + element)
return result
else: # list is not bigger than the length of the permutations, impossible.
print("k cannot exceed length of list")
我不断收到TypeError: can only concatenate list (not "int") to list
我应该如何修改这个?
【问题讨论】:
-
如果你想从头开始,这将无济于事,但你看过 python
itertools模块吗? docs.python.org/3/library/itertools.html -
能否将导致报错的参数提供给
permutations?谢谢! -
当您使用
for element in l:时,element不再是从 0 开始的索引,而是列表l的各个元素,一次一个。现在,在访问列表l的元素时,您不能使用l[:element]或l[element+1:]。您需要一个索引,您可以使用 enumerate asfor i, element in enumerate(l):来获取该索引,然后您可以使用l[:i] + l[i+1:] -
我一直在用 permutations([1,2,3,4], 3) 进行测试
-
另外,perm 是一个列表,所以你不应该用 [ ] 包裹它。元素是一个 int 所以你应该用 [ ] 包装它(在你追加到结果的行中)
标签: python algorithm recursion permutation