Самый интуитивный алгоритм действительно использует рекурсию.Когда у вас есть набор, мы будем предполагать, что вы можете перебирать все его элементы.
Если я вызову tail (e) набор всех элементов после элемента e.
Таким образом, я хочу прямотеперь комбинации (s, k)
зацикливаются на каждом элементе в s и получают e :: комбинаций (tail (e), k-1), где :: означает "сцепленный с каждым из"
Конечно, иногда таких комбинаций не будет (вы не в конце списка).
Вам просто нужна основная коллекция (набор наборов) для добавления ваших комбинаций и способ создания
Итак, предполагая, что у нас нет глобалов, мы можем получить что-то вроде:
getCombinations( headset [in], tailset [in], count [in], output [append] )
гарнитура или хвостовая часть могут быть пустыми.count может быть 0, в этом случае мы записываем «гарнитуру» для вывода (базовое условие), иначе мы перебираем каждый элемент в tailset, добавляя его (локально) в headset, делаем tailset (локально) хвостом нашего элемента, вычитаем 1от count и "recurse", вызывая функцию.