给定两个长度为k的向量A和B ,我们可以通过选择性地从A或B中选择元素来生成一对新的向量A1和B1。让我们从A或B中选择的决定由同样长度为k的位向量S决定。对于[0.. k ) 中的i,当S i为 0 时,将A i存储在A1 i中,将B i存储在B1 i中。如果S我为 1,反之亦然。
我们可以在 Delphi 中使用如下函数定义它:
procedure GeneratePair(const A, B: string; S: Cardinal; out A1, B1: string);
var
k: Cardinal;
i: Cardinal;
begin
Assert(Length(A) = Length(B));
k := Length(A);
Assert(k <= 32);
SetLength(A1, k);
SetLength(B1, k);
for i := 1 to k do
if (S and (1 shl Pred(i))) = 0 then begin
A1[i] := A[i];
B1[i] := B[i];
end else begin
A1[i] := B[i];
B1[i] := A[i];
end;
end;
如果我们以 0 到 2 k -1 的二进制数计数,这将给我们一个位向量序列,表示A和B之间交换或不交换字符的所有可能组合。
我们可以编写一个循环并使用上述函数生成所有 2 k组合:
A := '01011';
B := '00110';
for S := 0 to Pred(Round(IntPower(2, Length(A)))) do begin
GeneratePair(A, B, S, A1, B1);
writeln(A1, ', ', B1);
end;
这有效地使用了一组嵌套循环。外循环是从 0 到 31 的循环。内循环是函数内部从 1 到 的循环k
。正如你所看到的,我们不需要提前知道k的值。