我不清楚您希望您的 VB 代码以何种形式返回它生成的组合,但为简单起见,让我们假设一个列表列表。VB 确实允许递归,递归解决方案是最简单的。通过简单地尊重输入列表的顺序,可以很容易地获得组合而不是排列。
因此,列表 L 中有 N 个项目长的 K 个项目的组合是:
- 无,如果 K > N
- 整个列表 L,如果 K == N
- 如果 K < N,则两个串的并集:包含 L 的第一项和其他 N-1 项的 K-1 的任意组合的那些;加上其他 N-1 个项目的 K 个组合。
在伪代码中(例如,使用 .size 给出列表的长度,[] 作为空列表,.append 将项目添加到列表中,.head 获取列表的第一项,.tail 获取“所有但L)的第一项":
function combinations(K, L):
if K > L.size: return []
else if K == L.size:
result = []
result.append L
return result
else:
result = []
for each sublist in combinations(K-1, L.tail):
subresult = []
subresult.append L.head
for each item in sublist:
subresult.append item
result.append subresult
for each sublist in combinations(K, L.tail):
result.append sublist
return result
如果您采用更灵活的列表操作语法,则可以使此伪代码更简洁。例如,在 Python(“可执行伪代码”)中使用“切片”和“列表推导”语法:
def combinations(K, L):
if K > len(L): return []
elif K == len(L): return [L]
else: return [L[:1] + s for s in combinations(K-1, L[1:])
] + combinations(K, L[1:])
无论您是需要通过重复的 .append 来详细地构造列表,还是可以通过列表理解符号简明地构造它们,都是语法细节(就像选择头尾与列表切片符号来获取列表的第一项与其余项一样) ):伪代码旨在表达完全相同的想法(这也是之前编号列表中用英文表达的相同想法)。您可以用任何能够递归的语言来实现这个想法(当然,还有一些最小的列表操作!-)。