2017-06-07 8 views
0

このrecusionは、http://www.geeksforgeeks.org/print-all-possible-combinations-of-r-elements-in-a-given-array-of-size-n/から適合され、確かに、arrの可能なすべての固有の組み合わせを長さrで印刷します。再帰は、渡されたリストの値を上書きするのはなぜですか?

私が望むのは、可能な組み合わせをすべてリストに保存して、このアルゴリズムを別のプログラムでさらに使用することです。なぜ再燃焼でcombArrayの値が上書きされ、どうすれば解決できますか?今のよう

def combRecursive(arr, data, start, end, index, r, combArray): 
    if index == r: 
     combArray.append(data) 
     return combArray 

    i = start 
    while True: 
     if i > end or end - i + 1 < r - index: 
      break 
     data[index] = arr[i] 
     combArray = combRecursive(arr, data, i + 1, end, index + 1, r, combArray) 
     i += 1 
    return combArray 

def main(): 
    arr = [1, 2, 3, 4, 5] 
    r = 3 
    n = len(arr) 
    data = [9999999, 9999999, 9999999] 
    combArray = [] 

    combArray = combRecursive(arr, data, 0, n-1, 0, r, combArray) 
    print("All possible unique combination is: ") 
    for element in combArray: 
     print(element) 

結果:

[3, 4, 5] 
[3, 4, 5] 
[3, 4, 5] 
[3, 4, 5] 
[3, 4, 5] 
[3, 4, 5] 
[3, 4, 5] 
[3, 4, 5] 
[3, 4, 5] 
[3, 4, 5] 

は、私が欲しいもの:

[1, 2, 3] 
[1, 2, 4] 
[1, 2, 5] 
[1, 3, 4] 
[1, 3, 5] 
[1, 4, 5] 
[2, 3, 4] 
[2, 3, 5] 
[2, 4, 5] 
[3, 4, 5] 
+4

@Prune:ここにはデフォルトの引数はありません。 – user2357112

+1

あなたが望むのは、ホイールを再改造するのではなく、itertools.combinations([1,2,3,4,5]、3)]の '[list(x)for x]です。 – zwer

+0

@ user2357112:ありがと...私は明らかにリストをあまりにも速くクリックした。私は参照を編集することはできませんが、この問題は何度も前にSOで処理されています。 – Prune

答えて

0

あなたはdataを初期化した後、上からすると、それが意味するcombArrayに追加&に変更を加えますと同じ配列combArrayが常に追加されるため、その要素はすべて同じです。要素を別個の配列にする場合は、combArraysに追加する配列ごとに新しい配列を作成する必要があります(たとえば、コピーをdataにするなど)。

+0

I.E解決策は 'combArray.append(data)'を 'combArray.append(data [:])'に変更することです。まことにありがとうございます! – Fredrik

関連する問題