VB コードが生成した組み合わせをどのような形式で返すかは明確ではありませんが、簡単にするために、リストのリストを想定してみましょう。VB では再帰が許可されており、再帰的なソリューションが最も簡単です。入力リストの順序を順守するだけで、順列ではなく組み合わせを簡単に取得できます。
したがって、N アイテムの長さのリスト L からの K アイテムの組み合わせは次のようになります。
- なし、K > N の場合
- K == N の場合、リスト全体 L
- K < N の場合、2 つの束の和集合: 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 によってリストを冗長に構築する必要があるか、リスト内包表記によって簡潔に構築できるかは、構文の詳細です (リストの最初の項目と残りの項目を取得するための頭と尾とリストのスライス表記の選択と同様に) ): 疑似コードは、まったく同じアイデアを表現することを目的としています (これは、前の番号付きリストで英語で表現されたものと同じアイデアでもあります)。このアイデアは、再帰が可能な任意の言語で実装できます (もちろん、いくつかの最小限のリスト操作も可能です!-)。