我有帕斯卡代码(编程语言实际上没有任何意义):
框 [1] := 14;
框[2] := 2;
框[3] := 4;
盒子[4] := 5;
框[5] := 6;
盒子[6] := 8;
我想得到所有的可能性。例如,box[1] = box[6],然后 box[6] = box[1]。是的,我可以手写,但我想我可以通过循环使它更聪明。有什么建议么?
我采用了我在维基百科中找到的第一个排列算法,并在 Delphi (2009) 中实现了它;我希望这就是您正在寻找的:
type
TIntegerArray = array of Integer;
procedure Permutation(K: Integer; var A: TIntegerArray);
var
I, J: Integer;
Tmp: Integer;
begin
for I:= 2 to Length(A) do begin
J:= K mod I;
Tmp:= A[J];
A[J]:= A[I - 1];
A[I - 1]:= Tmp;
K:= K div I;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
K, I: Integer;
A: TIntegerArray;
S: string;
begin
Memo1.Lines.Clear;
for K:= 0 to 719 do begin
A:= TIntegerArray.Create(14, 2, 4, 5, 6, 8);
Permutation(K, A);
S:= '';
for I:= 0 to Length(A) - 1 do
S:= S + Format('%3.d ', [A[I]]);
Memo1.Lines.Add(S);
end;
end;
我已经回复你了?=S
所以基本上,你有一组可以包含(1)或排除(0)的项目。如果从 0 到 2^(项目数)-1 计数,每个整数将是一组位,指示包含哪些项目。
如果您有 7 个项目,则在从 0 到 127 的循环中,选择的项目是:
x0000000 (loop variable = 0, no items are chosen)
x0000001 (loop variable = 1, item [1] is chosen)
x0000010 (loop variable = 2, item [2] is chosen)
x0000011 (loop variable = 3, items [1] and [2] are chosen)
...
x1111111 (loop variable = 127, items [1], [2], [3], [4], [5], [6], [7] are chosen)