2017-10-26 6 views
0

整数のリスト([1,2,3]など)をとり、可能なすべての順列を出力するメソッドdef permutations(lst)を作成しようとしています、なし再帰を使用します。私はまた、このメソッドでスタックやキューを使用する必要があります。スタックやキューを使ったPythonでのintリストの置換

は、これまでのところ私が持っている:

class Queue: 

    def __init__(self): 
     self.items = [] 

    def isEmpty(self): 
     return self.items == [] 

    def enqueue(self, item): 
     self.items.insert(0,item) 

    def dequeue(self): 
     return self.items.pop() 

    def size(self): 
     return len(self.items) 

    def __rep__(self): 
     return str(self.items) 


def permutation(lst): 
    temp = [0] * len(lst) 
    q = Queue() 
    q.enqueue(lst) 
    i = 1 
    while i < len(lst): 
     if temp[i] < i: 
      j = temp[i] if i % 2 else 0 
      lst[j], lst[i] = lst[i], lst[j] 
      q.enqueue(lst) 
      temp[i] += 1 
      i = 1 
     else: 
      temp[i] = 0 
      i += 1 

    return q.__rep__() 


l = [1,2,3] 
print(permutation(l)) 

しかし、私が手出力は次のようになります。[[3、2、1]、[3、2、1]、[3、2、1]、[3 、2,1]、[3,2,1]、[3,2,1]]である。

しかし、エンキューする代わりにlstを印刷すると(エンキュー行を印刷するだけで置き換える)、正しい出力が得られます。 [1,2,3]、 [2,1,3]、[3,1,2]、[1,3,2]、[2,3,1]、[3,2,1]] 。

エンキューを使用するようにコードを変更するにはどうすればよいですか?任意の提案が高く評価されました。

+0

おそらく、組み込みの順列機能を使用できないようなアライメントですか? – roganjosh

+1

標準の[collections.dqueue](https://docs.python.org/3/library/collections.html#collections.deque)クラスを使用できます。 –

答えて

0

PROBLEM

問題がenqueueであなたのリストの参照である:あなたは同じリストに6つの参照を得ました。 1つの要素を変更するたびに、すべての要素が変更されます。あなたはエンキュー時にリストのコピーを作成し、その代わり

temp [0, 1, 0] 
lst [2, 1, 3] 
q [[2, 1, 3], [2, 1, 3]] 
temp [0, 0, 0] 
lst [2, 1, 3] 
q [[2, 1, 3], [2, 1, 3]] 
... 
temp [0, 0, 2] 
lst [3, 2, 1] 
q [[3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1]] 
temp [0, 0, 0] 
lst [3, 2, 1] 
q [[3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1]] 
[[3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1]] 

:中間地点でqを印刷し、あなたは効果が表示されます:

else: 
     temp[i] = 0 
     i += 1 
    print ("temp", temp) 
    print ("lst", lst) 
    print("q", q.__rep__()) 

出力

def enqueue(self, item): 
    self.items.insert(0, item[:]) 

これはあなたに望ましい出力を与えるでしょう。

+0

@roganjosh - ありがとう。私はただそれを修正した。 – Prune

+0

@ juanpa.arrivillagaはい、あなたもそれを見つけました。 – Prune

関連する問題