Для решения многих практических задач необходимо перечислить все сочетания фиксированной мощности, которые можно получить из элементов заданного конечного множества, а не только определить их число. Учитывая всегда существующую возможность целочисленной нумерации элементов любого конечного множества, в большинстве случаев допустимо ограничиться использованием алгоритмов перечисления сочетаний натуральных чисел. Наиболее естественным и простым из них является алгоритм перечисления сочетаний натуральных чисел в лексиграфическом порядке. Для формального описания этого алгоритма удобно считать, что основное множество, все сочетания по m элементов которого необходимо перечислить, образуют последовательные натуральные числа от 1 до n. Тогда любое сочетание из m<n чисел этого диапазона можно записать в векторной форме, располагая их в порядке возрастания значений слева направо:
C = (C1, C2, … Ci, …, Cm); 1 ≤ C1 < C2 < …< Ci < … < Cm ≤ n .
В результате упорядочивания значение в каждой позиции такого вектора сочетаний естественно оказывается ограниченным по величине сверху и снизу следующим образом:
i ≤ Ci ≤ (n − m + i); i = 1, …, m .
Лексиграфический алгоритм последовательно формирует такие векторы сочетаний, начиная с лексиграфически наименьшего вектора, где во всех позициях стоят следующие минимально возможные значения элементов, равные их индексам:
Cmin = (C1 = 1, C2 = 2, …, Ci = i, …, Cm = m).
Каждый очередной вектор сочетания формируется из текущего после просмотра его элементов слева направо с целью найти самый правый элемент, который еще не достиг своего предельного значения:
Cj = max { i | Ci < (n − m + i)}; j = m, …, 1.
Значение такого элемента следует увеличить на 1. Каждому элементу справа от него нужно присвоить наименьшее возможное значение, которое на 1 больше, чем у соседа слева. После указанных изменений очередной вектор сочетаний будет иметь следующий элементный состав:
C' = (C'1 = C1, …, C'j−1 = Cj−1, C'j = Cj + 1, C'j+1 = Cj + 2, …, C'm = Cj + m − j + 1).
Таким образом, очередной вектор сочетания будет лексиграфически больше предыдущего, так как значения их начальных (j-1) элементов равны по величине, а значение элемента в позиции j на 1 больше, чем у предыдущего. Указанное отношение возрастающего лексиграфического порядка гарантированно выполняется на всех итерациях алгоритма. В результате образуется возрастающая лексиграфическая последовательность, которую завершает лексиграфически наибольший вектор сочетания, где элементы всех позиций имеют следующие максимальные значения:
Cmax = (C1 = n − m + 1, C2 = n − m + 2, …, Ci = n − m + i, …, Cm = n).
Рассмотренный лексиграфический алгоритм иллюстрирует следующий пример, где нужно перечислить в возрастающем лексиграфическом порядке все 15 сочетаний из n=6 первых натуральных чисел по m=4 числа, то есть все возможные четырех элементные подмножества основного образующего множества {1, 2, 3, 4, 5, 6}. Результаты вычислений представлены в следующей таблице:
Таблица 1    
(1, 2, 3, 4 )1(1, 2, 4, 5)4(1, 3, 4, 5)7(1, 4, 5, 6)10(2, 3, 5, 6)13
(1, 2, 3, 5)2(1, 2, 4, 6)5(1, 3, 4, 6)8(2, 3, 4, 5)11(2, 4, 5, 6)14
(1, 2, 3, 6)3(1, 2, 5, 6)6(1, 3, 5, 6)9(2, 3, 4, 6)12(3, 4, 5, 6)15

В этом примере наибольшие допустимые значения чисел в позициях векторов сочетаний равны, соответственно, 3, 4, 5 и 6. Для удобства интерпретации результатов в каждом векторе сочетаний подчеркиванием выделен крайний правый элемент, который еще не достиг своего максимального значения. Числовые индексы векторов сочетаний определяют их номера в лексиграфическом порядке. В общем случае лексиграфический номер N любого сочетания из n элементов по m можно вычислить по следующей формуле, где из косметических соображений для обозначения чисел сочетаний использована символика Аппеля:
N(C1, C2, … Ci, … Cm) = - - - ... - - ... -
В частности, следующие вычисления по этой формуле номера сочетания (1, 3, 4, 6) из n=6 элементов по m=4 в лексиграфическом порядке дадут результат N=8, который соответствует примеру, рассмотренному выше:
N(1, 3, 4, 6) = (64) - (6 - 14) - (6 - 34 - 1) - (6 - 44 - 2) - (6 - 64 - 3) = (64) - (54) - (33) - (22) - (01) = 8
В общем случае, используя тождество для суммы чисел сочетаний по обоим индексам, можно показать, что номер лексиграфически наименьшего сочетания (1,..., i, ..., m) при вычислении его по данной формуле всегда будет равен 1:
N(1, ...i, ... m) = - ... - ... - = - + = 1
Очевидно также, что номер лексиграфически наибольшего сочетания (m, … n - m+i, …n) при вычислении его по данной формуле будет равен числу сочетаний из n элементов по m:
N(m, m + 1, ...n - m + i, ... n - 1, n) = - ... - ... - - =
Формулу вычислений лексиграфических номеров сочетаний можно использовать для решения обратной задачи, где требуется определить вектор сочетания по его номеру в лексиграфическом порядке. Для решения такой обратной задачи ее нужно записать в виде уравнения, где все неизвестные значения элементов вектора искомого сочетания (C1, … Ci, … Cm) сосредоточены в числах сочетаний его правой части, а в левой части записана известная разность L числа сочетаний из n элементов по m и номера искомого сочетания N:
L = - N = (n - C1m) + + ... + + ... +
Решение этого уравнения обеспечивает следующий "жадный" алгоритм, на итерациях которого производится последовательный выбор значений элементов вектора искомого сочетания. На начальной итерации выбирается минимально возможное (в пределах своих ограничений) значение C1, при котором первое слагаемое правой части будет иметь максимальное значение, не превосходящее L:
C*1 = min(1 ≤ C1 ≤ n - m) | ≤ L = - N
Теперь левую часть L следует уменьшить на величину первого числа сочетаний в правой части при выбранном значении C1 , чтобы аналогичным образом определить значение C2 на второй итерации:
C*2 = min(2 ≤ C2 ≤ n - m + 1) | ≤ L = - N -
Аналогичным образом следует выполнить все последующие итерации, чтобы выбрать значения всех остальных элементов Ci искомого сочетания, вплоть до последнего элемента Cm:
C*i = min(i ≤ Ci ≤ n - m + i) | ≤ L = - N - - ... - (n - C*i-1m - i)
По очевидным причинам значение последнего элемента Cm можно определить исходя уже из равенства его числа сочетаний остаточному значению левой части L:
C*m = min(m ≤ Cm ≤ n) | ≤ L = - N - - ... -
Следует отметить, что значение последнего элемента сочетания Cm можно найти еще более просто, без перебора его возможных значений:
C*m = m - L = n - + N + + ... +
Выполнение итераций рассмотренного алгоритма иллюстрирует следующий пример, где нужно определить сочетания с номером N=8 в лексиграфическом порядке, если n=6 и m=4:
C*1 = min(1 ≤ C1 ≤ 3) | ≤ L = - 8 = 7 ->  C*1 = 1;
C*2 = min(2 ≤ C2 ≤ 4) | ≤ L = - 8 - = 2 ->  C*2 = 3;
C*3 = min(3 ≤ C3 ≤ 5) | (6 - C32) ≤ L = - 8 - - = 1 ->  C*3 = 4;
C*4 = min(4 ≤ C4 ≤ 6) | ≤ L = - 8 - - - = 1 ->  C*4 = 6.
Алгоритмическая возможность определить сочетание по заданному номеру в лексиграфическом порядке может быть использована в различных направлениях. В частности, когда при перечислении сочетаний в лексиграфическом порядке требуется обеспечить возврат к любому сочетанию, которое было получено раньше, достаточно знать только его номер. Точно также можно начинать или продолжать перечисление сочетаний с любого желаемого номера. Кроме того, становится возможным порождать сочетания в любом детерминированном или случайном порядке, который устанавливает и регламентирует произвольно заданная последовательность их лексиграфических номеров.