我不清楚你想让你的VB代码以什么形式返回它生成的组合,但为了简单起见,我们假设一个列表清单。 VB确实允许递归,而递归解决方案最简单。通过简单地遵守输入列表的排序,可以轻松地获得组合而不是排列。
所以,K个出列表L这是N个项目的组合久是:
- 没有,如果K>ň
- 整个列表L,如果满足K ==ñ
- 如果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以冗长构造列表,或可以通过简洁列表理解符号构建它们,是一个语法细节(正如选择首尾相对列表切片符号以获得列表的第一项与其余部分一样):伪代码旨在表达完全相同的想法(这也表达了相同的想法英文在前面的编号列表中)。你可以用任何能够递归的语言实现这个想法(当然,还有一些最小的列表操作!)。在C#