【发布时间】:2021-02-22 17:02:21
【问题描述】:
我正在尝试为可变数量的位置生成一定数量的数字(例如,0 和 1)的所有排列。我将调用数字的数量ord(例如,ord=2 仅用于 0 和 1;ord=3 用于 0、1 和 2)和位置数量Num。因此排列的数量是ord**Num。
注意:我不想使用 itertools 或任何其他类型的内置函数。我是出于好奇而提出这个问题,而不仅仅是试图找到解决方案。
对于ord=2 和Num=3,按任意顺序的输出应该是:
[[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
这可以通过以下方式完成:
ord = 2
mylist = []
for a in range(ord):
for b in range(ord):
for c in range(ord):
mylist.append([a,b,c])
对于ord = 2 和Num = 4,输出应为:
[[0,0,0,0],[0,0,0,1],[0,0,1,0],[0,0,1,1],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1],[1,0,0,0],[1,0,0,1],[1,0,1,0],[1,0,1,1],[1,1,0,0],[1,1,0,1],[1,1,1,0],[1,1,1,1]]
但是我必须添加另一个嵌套的 for 循环:
ord = 2
mylist = []
for a in range(ord):
for b in range(ord):
for c in range(ord):
for d in range(ord):
mylist.append([a,b,c,d])
一个明显的解决方案是将 0 和 1 随机添加到长度为 Num 的列表中,然后如果该列表尚未添加到 mylist 中,则接受该列表,但我想要一个不完全的解决方案太可笑了。
这是迄今为止我最接近真正解决方案的方法:
def myperms(elem, mylist):
for i in range(len(elem)-1,-1,-1):
while (elem[i] + 1) < ord:
elem = list(elem)
elem[i] += 1
if elem not in mylist:
mylist.append(elem)
if (elem[i] + 1) >= ord:
elem = list(elem)
elem[i] = 0
return mylist
Num = 3
ord = 2
TotsNum = ord**Num
mylist = []
elem = [0,]*Num
mylist.append(elem)
print(myperms(elem, mylist))
但这只会给出:
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0]]
我已尝试在其内部调用函数(递归),但我无法弄清楚如何正确执行此操作。有没有人对如何递归解决它有任何想法?谢谢!
【问题讨论】:
标签: python recursion permutation