2015-10-26 3 views
3

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

, например:

per(range(3)) 

должен вернуться:

[[0, 1, 2], [1, 0, 2], [1, 2, 0], [0, 2, 1], [2, 0, 1], [2, 1, 0]] 

я сделал следующее, но я получаю пустой список.

def per(l): 
    return [l[i]+p for i in range(len(l))for p in per(l[:i] + l [i+1:])] 

Кто-нибудь знает, почему я получаю пустой список и как его решить?

+0

Похоже, это может быть домашнее задание, в этом случае вы можете быть удовлетворены простым рекурсивного решения. Но - если вы собираетесь делать что-либо с этими перестановками, то вам может понадобиться изучить алгоритм Джонсона-Троттера: https://en.wikipedia.org/wiki/Steinhaus%E2%80%93Johnson%E2% 80% 93Trotter_algorithm. –

ответ

1

Проблема в том, что конечное условие для вас было бы, когда длина списка 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 
+0

Это также будет работать с конечным условием для рекурсии, когда длина списка равна '0', но для этого вам нужно будет вернуть пустой список списков, например -' [[]] '. –

+0

Хорошо, я понял. Спасибо за помощь! :) – usr9

Смежные вопросы