プログラミングの質問 の整数配列内のすべての部分集合を見つけるPythonソリューションを実装しようとしています。重複のない整数配列のすべてのサブセットを含む配列 を返し、 をソートする必要があります。私の再帰的なPythonソリューションは、回答リストの現在のすべての項目を追加して現在のリストに置き換えています。
def subsetHelper(cur_set, index, A, ans):
if index >= len(A):
print "appending ", cur_set
ans.append(cur_set)
print "ans: ", ans
return
# don't include current number
subsetHelper(cur_set, index+1, A, ans)
# include current number
cur_set.append(A[index])
subsetHelper(cur_set, index+1, A, ans)
cur_set.pop()
def subsets(A):
A.sort()
ans = []
cur_set = []
# dont include current number
subsetHelper(cur_set, 0, A, ans)
return ans
この同じロジックをC++で実装すると、正しい戻り値が得られます。しかし、私がPythonでこれを行うと、最後に空リストのコレクションが得られますが、反復処理中は、リスト内のすべてのアイテムに同じ現在のリストがコピーされます。 。なぜこうなった?ここでは、出力は次のようになります。
print subsets([1,2,3])
appending []
ans: [[]]
appending [3]
ans: [[3], [3]]
appending [2]
ans: [[2], [2], [2]]
appending [2, 3]
ans: [[2, 3], [2, 3], [2, 3], [2, 3]]
appending [1]
ans: [[1], [1], [1], [1], [1]]
appending [1, 3]
ans: [[1, 3], [1, 3], [1, 3], [1, 3], [1, 3], [1, 3]]
appending [1, 2]
ans: [[1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]
appending [1, 2, 3]
ans: [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
[[], [], [], [], [], [], [], []]
私はあなたがなぜこれをクラスにしているのか分かりません。同じパラメータを渡すメソッド以外のインスタンス属性はありません。とにかく、問題はあなたが同じリストを回っていて、コピーを作っていないということです。つまり、あなたは同じリストへの参照のリストを構築しています! 'cur_list'を追加するたびに、それは同じリストオブジェクトです。そのため、最終的にsubsetHelperへのすべての再帰呼び出しが最後の行に達したときにeverythinをポップすると、空のリストのリストが表示されます。 –
あなたはこの出力を得るために使用する完全なコードをお願いしますか? (つまり、あなたは 'Solution'と呼んでいます)。 – pistache
これを使用しないでください。これは、実装をテストするために([itertools](https://docs.python.org/dev/library/itertools.html)と同様に)動作します: 'def subsets(L):sort sorted (2 ** len(L))]) ')のiについて1 << j&iならば範囲内のj([L [j])ll: – jedwards