Реферат: Генерация комбинаторных объектов
i:=N;
while (i>0) and (B[i]>=B[i+1]) do i:=i-1;
if i=0 then exit;
for j:=i+1 to N do
if (B[j]>B[i]) then K:=j;
SwapB(B,i,k);
for j:=i+1 to (i+ ((N+1-i) div 2)) do SwapB(B,j,N+i+1-j);
WriteB(B);
end;
end;
begin
readln(N,M);
for i:=1 to M do b[i]:=i;
PermuteAll(B,M);
while (true) do
begin
i:=M;
while (i>0) and (b[i]=N-m+i) do Dec(i);
if i=0 then exit;
Inc(B[i]);
for j:=i+1 to M do B[j]:=B[j-1]+1;
PermuteAll(B,M);
end;
readln;
end.
Пояснения к программе:
1. Главная программа вводит числа N, M и генерирует по описанному выше алгоритму все сочетания из N по M. Для каждого построенного в векторе B сочетания вызывается процедура PermuteAll, которой в качестве параметров передаются текущее сочетание B и количество элементов в нем M. Процедура PermuteAll генерирует для полученного сочетания все возможные перестановки.
2. Массив B передается в процедуру PermuteAll по значению (при объявлении процедуры при параметре B нет ключевого слова VAR) и потому изменения массива B в процедуре PermuteAll не влияют на содержимое массива B в главной программе.
3. В то же время для того, что бы процедура SwapB могла обменивать значения в B и возвращать измененный массив в вызывающую ее процедуру PermuteAll, массив B добавлен в параметры процедуры SwapB с передачей по адресу - используя ключевое слово VAR.