【发布时间】:2016-12-21 06:49:31
【问题描述】:
考虑以下代码,它生成数组 [1,2,3,...,n] 的所有大小为 k 的子集:
def combinations(n, k):
result = []
directed_combinations(n, k, 1, [], result)
return result
def directed_combinations(n, k, offset, partial_combination, result):
if len(partial_combination) == k:
new_partial = [x for x in partial_combination]
result.append(new_partial)
return
num_remaining = k - len(partial_combination)
i = offset
# kind of checks if expected num remaining is no greater than actual num remaining
while i <= n and num_remaining <= n - i + 1:
partial_combination.append(i)
directed_combinations(n, k, i + 1, partial_combination, result)
del partial_combination[-1]
# partial_combination = partial_combination[:-1] <-- same funcationality as line above, but produces weird bug.
i += 1
print(combinations(n=4,k=2))
例如,combinations(n=4,k=2) 将生成 [1,2,3,4] 的所有长度为 2 的子集。
代码中有两行生成一个列表,其中最后一个元素被删除。我尝试使用del 完成它,并通过切掉最后一个元素(即[-1])来创建一个全新的列表。带有del 的版本会产生正确的结果。但是,带有[-1] 的版本没有。没有运行时错误;只是一个逻辑错误(即不正确的结果)。
我怀疑这与在进行切片时创建新列表与使用 del 保持相同列表有关。我似乎无法理解为什么这是一个问题。
【问题讨论】:
标签: python algorithm python-3.x recursion