Мне нужно получить все перестановки итерируемой длины n
в алгоритме грубой силы. Я не хочу использовать itertools
или любые другие внешние пакеты.
Я подумал, что мог бы использовать алгоритм кучи, но мой код возвращает только одну перестановку, повторенную для n! времена:
def permutations(l):
n = len(l)
result = []
c = n * [0]
result.append(l)
i = 0;
while i < n:
if c[i] < i:
if i % 2 == 0:
tmp = l[0]
l[0] = l[i]
l[i] = tmp
else:
tmp = l[c[i]]
l[c[i]] = l[i]
l[i] = tmp
result.append(l)
c[i] += 1
i = 0
else:
c[i] = 0
i += 1
return result
Я не могу понять, почему это происходит. Я также пытаюсь выяснить, есть ли более эффективный способ сделать это, возможно, с помощью рекурсивной функции.