Мне не ясно, в какой форме вы хотите, чтобы ваш VB-код возвращал комбинации, которые он генерирует, но для простоты давайте предположим список списков. VB допускает рекурсию, и рекурсивное решение является самым простым. Делать комбинации, а не перестановки можно легко, просто соблюдая порядок в списке ввода.
Итак, комбинации из K предметов из списка L, длина которого N, равны:
- нет, если K> N
- весь список L, если K == N
- если 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 или можно кратко создавать их с помощью нотации для понимания списков, - это детали синтаксиса (как выбор нотации головы и хвоста по сравнению с нарезкой списка, чтобы получить первый элемент списка против остальных): псевдокод предназначен для выражения точно такой же идеи (которая также является той же идеей, выраженной на английском языке в предыдущем пронумерованном списке). Вы можете реализовать эту идею на любом языке, который способен к рекурсии (и, конечно, к некоторым операциям с минимальным списком! -).