为什么递归会覆盖传递的列表中的值?

时间:2017-06-07 21:54:23

标签: python recursion tree permutation combinatorics

此回归改编自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]

1 个答案:

答案 0 :(得分:0)

您初始化data,从那时起对其进行更改&amp;将其添加到combArray,这意味着您始终将相同的数组添加到combArray,因此它的所有元素都是相同的。如果您希望元素是不同的数组,则需要为要添加到combArrays的每个元素创建一个新数组(例如,复制data)。