Перестановки без повторов без использования itertools - PullRequest
0 голосов
/ 30 апреля 2020

Мне нужно получить все перестановки итерируемой длины 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

Я не могу понять, почему это происходит. Я также пытаюсь выяснить, есть ли более эффективный способ сделать это, возможно, с помощью рекурсивной функции.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Я бы использовал ответ от @David S. Или вы можете использовать этот код:

def permutate(ls):
    if len(ls) == 0: return []
    elif len(ls) == 1: return [ls]
    else:
        ls1 = []
        for i in range(len(ls)):
            x = ls[i]
            y = ls[:i] + ls[i+1:]
            for p in permutate(y): ls1.append([x]+p)
        return ls1

a = str(input("To permutate? ")).split(" ")
for i in permutate(a): print(" ".join(i))

Но это в основном то же самое: D

1 голос
/ 30 апреля 2020

Вы можете использовать следующее, это без использования других внутренних функций, но использует рекурсию:

def permutation(lst):
    if len(lst) == 0:
        return []
    if len(lst) == 1:
        return [lst]

    l = [] # empty list that will store current permutation

    for i in range(len(lst)):
       m = lst[i]

       # Extract lst[i] or m from the list. remainderLst is remaining list
       remainderLst = lst[:i] + lst[i+1:]

       # Generating all permutations where m is first element
       for p in permutation(remainderLst):
           l.append([m] + p)
    return l


data = list('12345')
for p in permutation(data):
    print(p)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...