Проблема в том, что конечное условие для вас было бы, когда длина списка l
равна 0
и возвращает пустой список. Следовательно, когда длина списка равна 1
, внутренний цикл никогда не выполняется, и, следовательно, это также возвращает пустой список, и это продолжается, и вы всегда получаете пустые списки.
Исправить было бы конечное условие, когда длина списка равна 1
, и вы должны возвращать списки списков, а не простые списки. Пример -
def per(l):
if len(l) == 1:
return [l]
return [[l[i]] + p for i in range(len(l))for p in per(l[:i] + l [i+1:])]
Demo -
>>> def per(l):
... if len(l) == 1:
... return [l]
... return [[l[i]] + p for i in range(len(l))for p in per(l[:i] + l [i+1:])]
...
>>>
>>> per([2])
[[2]]
>>> per([0,1,2])
[[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0]]
>>> per([0,1,2, 3])
[[0, 1, 2, 3], [0, 1, 3, 2], [0, 2, 1, 3], [0, 2, 3, 1], [0, 3, 1, 2], [0, 3, 2, 1], [1, 0, 2, 3], [1, 0, 3, 2], [1, 2, 0, 3], [1, 2, 3, 0], [1, 3, 0, 2], [1, 3, 2, 0], [2, 0, 1, 3], [2, 0, 3, 1], [2, 1, 0, 3], [2, 1, 3, 0], [2, 3, 0, 1], [2, 3, 1, 0], [3, 0, 1, 2], [3, 0, 2, 1], [3, 1, 0, 2], [3, 1, 2, 0], [3, 2, 0, 1], [3, 2, 1, 0]]
>>> len(per([0,1,2, 3]))
24
Похоже, это может быть домашнее задание, в этом случае вы можете быть удовлетворены простым рекурсивного решения. Но - если вы собираетесь делать что-либо с этими перестановками, то вам может понадобиться изучить алгоритм Джонсона-Троттера: https://en.wikipedia.org/wiki/Steinhaus%E2%80%93Johnson%E2% 80% 93Trotter_algorithm. –