我正在尝试解决编程面试问题,其中我必须生成数组的子集。假设数组为[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] ]。
这是怎么回事?我以为结果不会有差异,因为这只是变量名的差异。
答案 0 :(得分:1)
不仅变量名称有所不同,两个变量也一样。 i
和start
具有不同的值。 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的值。因此它们是不可互换的。