为什么在计算数组的子集时,变量名似乎有所不同?

时间:2018-08-07 02:11:20

标签: python algorithm recursion backtracking

我正在尝试解决编程面试问题,其中我必须生成数组的子集。假设数组为[1,2,3]。当我使用时:

def subsets(arr):
   def explore(arr, ans, temp, start, size):
      ans.append(temp[:])

      for i in range(start, size):
         #choose
         temp.append(arr[i])
         #explore
         explore(arr, ans, temp, start + 1, size)
         #undo
         temp.pop()
ans = []
size = len(arr)
explore(arr, ans, [], 0, size)
return ans

我得到:[[],[1],[1、2],[1、2、3],[1、3],[1、3、3],[2],[2、2 ],[2、2、3],[2、3],[2、3、3],[3],[3、2],[3、2、3],[3、3],[3 ,3,3]]

但是,当我使用i而不是start时,就像这样:

def subsets(arr):
def explore(arr, ans, temp, start, size):
    ans.append(temp[:])
    for i in range(start, size):
        #choose
        temp.append(arr[i])
        #explore
        explore(arr, ans, temp, i + 1, size)
        #undo
        temp.pop()
ans = []
size = len(arr)
explore(arr, ans, [], 0, size)
return ans

我得到正确的答案,[[],[1],[1、2],[1、2、3],[1、3],[2],[2、3],[3] ]。

这是怎么回事?我以为结果不会有差异,因为这只是变量名的差异。

2 个答案:

答案 0 :(得分:1)

不仅变量名称有所不同,两个变量也一样。 istart具有不同的值。 i循环访问以start开始并以size-1结尾的整数列表,而start在所有这些循环中都是常数。希望能帮助到你。

答案 1 :(得分:0)

使用itertools可能会容易得多……除非不允许这样做。

import itertools

stuff = [1, 2, 3]
for L in range(0, len(stuff)+1):
    for subset in itertools.combinations(stuff, L):
        print(subset)

关于您的问题。 i是循环的每次迭代中递增的值,start是第一次迭代中i的值。因此它们是不可互换的。