gpt4 book ai didi

delphi - Delphi 中嵌套 for 循环的替代方案

转载 作者:行者123 更新时间:2023-12-03 15:50:12 29 4
gpt4 key购买 nike

我遇到了以下(概念上非常简单)问题,并想编写代码来做到这一点,但我很挣扎。假设我们有两行长度相等的 k。每行的每个单元格可以是 0 或 1。

例如,考虑以下行对,k = 5:01011, 00110

现在,如果两行可以在每个单元格中自由交换值,则将存在 2^5 种可能的行对组合(其中一些可能不是唯一的)。例如,我们可以将 00010、01111 作为上述数据中的一个可能的行对。我想在 Delphi 中编写代码来列出所有可能的行对。通过一组嵌套的 for 循环就可以很容易地做到这一点。但是,如果 k 的值仅在运行时已知,我不确定如何使用这种方法,因为我不知道需要多少个索引变量。我也不知道 case 语句有什么帮助,因为我不知道 k 的值。

我希望有一个嵌套 for 循环的替代方案,但任何想法将不胜感激。谢谢。

最佳答案

给定两个长度为 k 的向量 AB,我们可以生成一对新向量 A1B1,通过有选择地从AB中选择元素。让我们选择 AB 的决定由位向量 S 决定,长度也是 k。对于 [0..k) 中的 i,当 Si 为 0 时,存储 A<A1i 中的 sub>iB1 中的 Bi 。如果Si为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 到 2k−1,这将为我们提供一个位向量序列,表示交换或不交换的所有可能组合AB 之间的字符。

我们可以编写一个循环并使用上面的函数来生成所有 2k 个组合:

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的值。

关于delphi - Delphi 中嵌套 for 循环的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18663591/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com