在本周的作业中,我被要求编写一个Python脚本,该脚本使用数字n并返回[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 :(得分:0)
由于您希望包含数字从0到n-1的列表的所有排列,因此您已经有明确的步骤需要采取:
使用内置的range()
函数可以轻松完成此操作,因为它主要用于此目的:
这是一种通用功能,用于创建可迭代的变量,从而产生算术级数。
数学告诉我们,拥有N个元素,就会有N个!这些元素的不同排列,!表示阶乘。我们可以从数学模块中导入阶乘函数,这将很快使我们能够计算列表中的排列数量:
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))