最近写个函数,就是组合的遍历。比如,10个数,取3个数的所有组合,都知道,用一个3重循环好、是最简单的。不过要是通用一点的话,n个数,取m个数的所有组合。m个循环就不好写了,循环的深度无法用变量,因此写了一个小循环来做
Delphi 的例子
procedure TfrmCompose.btn1Click(Sender: TObject);
var x: array of Integer;
i, j, n, m: Integer;
k: array of Integer;
s: string;
jw: Boolean;
begin
n := StrToInt(edt1.Text);
m := StrToInt(edt2.Text);
SetLength(x, n);
SetLength(k, m);
for i := 0 to n - 1 do x[i] := i + 1;
for i := 0 to m - 1 do k[i] := i;
mmo1.Lines.BeginUpdate;
mmo1.Clear;
while True do
begin
//取得组合下标
s := '';
for i := 0 to m - 1 do
s := s + Format('%.2d',[x[k[i]]]) + ',';
mmo1.Lines.Add(s); //实际应用中应调用相应的函数
jw := True;
for i := m - 1 downto 0 do
begin
if jw then
begin
k[i] := k[i] + 1;
for j := i + 1 to m - 1 do
begin
k[j] := k[j - 1] + 1;
end;
jw := k[i] >= n + i - (m - 1);
end
else Break;
end;
if jw then Break;
end;
mmo1.Lines.EndUpdate;
end;