我不清楚你想讓你的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#