Python中生成列表长度为k的所有排列的递归算法

Python中生成列表长度为k的所有排列的递归算法,python,algorithm,recursion,permutation,Python,Algorithm,Recursion,Permutation,我想创建一个递归算法来生成所有排列 具有某个长度的整数列表的指定长度n 以下是我的想法: 对于列表中的每个元素,我都可以删除它,然后让递归函数返回所有长度为k-1的排列,然后将删除的数字添加到每个排列中。然后对列表中的所有数字重复此过程 基本情况是当列表为空或仅包含一个元素时。 在这种情况下,我只返回列表。也就是说,只要k小于或等于列表的长度(例如,如果k是3,但是l=[1,2],我就不能产生任何长度的排列k) 这是我写的: def permutations(l, k): w = len(l)

我想创建一个递归算法来生成所有排列 具有某个长度的整数列表的指定长度
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")
def置换(l,k):
w=len(l)
在python中,当使用

for a in b:
“a”实际上不是一个可以用作索引的数字,而是指向列表“b”中实际元素的指针

b = ["Bob", "Jim", "Jane"]
然后在第一次迭代中,“a”将等于“Bob”,而不是0

如果要生成索引号而不是指向元素的指针,可以使用:

for a in range(0, len(b)):
相反,使用它,您的代码应该可以工作

e、 g

在python中,当使用

for a in b:
“a”实际上不是一个可以用作索引的数字,而是指向列表“b”中实际元素的指针

b = ["Bob", "Jim", "Jane"]
然后在第一次迭代中,“a”将等于“Bob”,而不是0

如果要生成索引号而不是指向元素的指针,可以使用:

for a in range(0, len(b)):
相反,使用它,您的代码应该可以工作

e、 g


有两个问题:

首先
[perm]+元素
这里您将向整数添加一个列表

Second
listSmaller=l[:元素]+l[元素+1:]
在这里,您需要一个索引来访问列表中的元素。您当前正在使用这些元素作为索引,因此将获得一个
索引器
,因为当
element=4
时,
element+1
将是
5
,但您没有
l[4+1:


当我对您的代码进行以下更改时,您的代码可以工作。我只显示修改后的行。我不确定输出是否如预期的那样。您可以尝试一下,然后告诉我

for i, element in enumerate(l):
    listSmaller = l[:i] + l[i+1:]

    for perm in permutations(listSmaller, k-1):
        result.append([perm] + [element])

有两个问题:

首先
[perm]+元素
这里您将向整数添加一个列表

Second
listSmaller=l[:元素]+l[元素+1:]
在这里,您需要一个索引来访问列表中的元素。您当前正在使用这些元素作为索引,因此将获得一个
索引器
,因为当
element=4
时,
element+1
将是
5
,但您没有
l[4+1:


当我对您的代码进行以下更改时,您的代码可以工作。我只显示修改后的行。我不确定输出是否如预期的那样。您可以尝试一下,然后告诉我

for i, element in enumerate(l):
    listSmaller = l[:i] + l[i+1:]

    for perm in permutations(listSmaller, k-1):
        result.append([perm] + [element])
#code采用列表lst和int n表示排列的长度
#返回lst中项目长度为n的所有排列
def Perm(lst,n):
#如果置换长度为负或0,则返回空
如果n
#code采用列表lst和int n表示置换的长度
#返回lst中项目长度为n的所有排列
def Perm(lst,n):
#如果置换长度为负或0,则返回空

如果您试图从头开始,这将不会有帮助,但是您是否查看了python
itertools
模块?能否提供导致报告错误的
排列的参数?谢谢!当您在l:
中使用
元素时,
元素
不再是从0但列表中的单个元素
l
,一次一个。现在,当访问列表中的元素
l
时,您不能使用,
l[:元素]
l[元素+1::::
。您需要一个索引,可以使用enumerate as
为i获取,enumerate(l)中的元素:
,然后您可以使用
l[:i]+l[i:]
我一直在测试置换([1,2,3,4],3)而且,置换是一个列表,所以不应该用[]来包装它。元素是一个int,所以应该用[]来包装它(在结果的附加行中)如果您试图从头开始,这是没有帮助的,但是您看过python
itertools
模块了吗?您能提供导致报告错误的
排列的参数吗?谢谢!当您在l:
中为元素使用
时,
元素
不再是从0b开始的索引ut列表中的单个元素,一次一个。现在,当访问列表中的元素时,您不能使用,
l[:element]
l[element+1:://code>。您需要一个索引,您可以使用enumerate as
为i获取该索引,enumerate(l)中的元素:
,然后您可以使用
l[:i]+l[i:]
我一直在测试置换([1,2,3,4],3)而且,置换是一个列表,所以不应该用[]来包装它。元素是一个int,所以应该用[]来包装它(在结果的附加行中)虽然此代码片段可以解决问题,但确实有助于提高您的文章质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。虽然此代码片段可以解决问题,但确实有助于提高您文章的质量。请记住如果您将来为读者回答这个问题,那么这些人可能不知道您的代码建议的原因。