在本周的作业中,我被要求编写一个带有数字n的python脚本,并返回[0,1,2,...,n-1]的所有排列。到目前为止,我已经编写了一个脚本,它接受一个列表并返回列表的下一个排列。我正在寻找关于如何根据我到目前为止所写的内容编写脚本的想法。
def next_permutation(p):
a = len(p)
i = a -2
while i >= 0 and p[i] >= p[i+1]:
i = i-1
if i == -1:
return []
j = i+1
while j < a and p[j] >= p[i]:
j += 1
j-=1
p[i], p[j] = p[j], p[i]
k = i + 1
l = a - 1
while k < l:
p[k], p[l] = p[l], p[k]
k += 1
l -= 1
return p
编辑:这是返回列表的下一个排列的代码。我完全是根据我的导师提供的指示写的。
由于您希望列表的所有排列的数字从0到n-1,因此您已经有了需要采取的明确步骤:
这可以通过内置的range()
函数轻松完成,因为它主要用于此目的:
这是一个多功能函数,用于创建迭代,从而产生算术进展。
数学告诉我们有N个元素,会有N!这些元素的不同排列,wher!意味着阶乘。我们可以从数学模块导入阶乘函数,这将很快允许我们计算列表将具有的排列量:
from math import factorial
print(factorial(4)) # 24
next_permutation(p)
,并产生每一个排列。要从函数返回多个内容,可以使用yield。
考虑到这些步骤,您可以创建类似于此的内容:
def all_permutations(n):
# Constructing a list that contains all numbers from 0 to n-1
integer_list = list(range(n))
# Calculating the amount of permutations such list would have
permutation_count = factorial(n)
# Output that many permutations
for _ in range(permutation_count):
yield integer_list
integer_list = next_permutation(integer_list)
此生成器函数将生成包含从0到n-1的数字的列表的所有排列,这正是您所需要的。
要创建一个包含所有排列的列表,您可以编写一些简单的内容,例如:
n = 4
all_permutations = list(all_permutations(n))