如何在delphi中跳过一些嵌套循环?
问题描述:
任何人都可以请帮助我在Delphi中的这个话题?如何在delphi中跳过一些嵌套循环?
我有5个嵌套的“for”块循环迭代变量k1,k2 .. k5。
另一个变量k必须控制5个以上循环的深度。该变量在运行时定义。
是否有可能消除k块内部'for'块的执行,就好像它们已被评论一样?解释码的短列表是在这里:
k := 2;
for k1 := 1 to 100 do begin
for k2 := 1 to 100 do begin
for k3 := 1 to 100 do begin
for k4 := 1 to 100 do begin {want to skip this loop}
for k5 := 1 to 100 do begin {want to skip this loop}
AnywayDoThat; // must execute anyway
end; {k5}
end; {k4}
end;
end;
end;
另外说明,当k等于2,我希望避免的环路K4和K5(在大括号结束码行)执行,缩短的全流程序。当然,proc Anyway DoThat必须执行。
我用Delphi 6
编辑:对不起 '淘汰' 坏字眼。目的是为了避免不必要的迭代。通过仅执行一次来跳过循环的技巧非常完美。因此,按照k1,k2,k3只能达到proc AnywayDo。
答
你可以使用下面的技巧
Var
Maxes: array [1..5] of integer;
Eliminators: array [1..5] of integer; // they have to be of same length
begin
SetArray(Maxes, [100, 100, 100, 100, 100]);
SetArray(Eliminators, [1, 1, 1, 1, 1]);
// Here you set K
K := 2; // you need to make sure K <= 5
// Set the Eliminators array
for I := 1 to K do
begin
Eliminators[5-I+1] := Maxes[5-I+1];
end;
// Now to the loops
for k1 := 1 to Maxes[1] div Eliminators[1] do begin
for k2 := 1 to Maxes[2] div Eliminators[2] do begin
for k3 := 1 to Maxes[3] div Eliminators[3] do begin
for k4 := 1 to Maxes[4] div Eliminators[4] do begin
for k5 := 1 to Maxes[5] div Eliminators[5] do begin
AnywayDoThat; // must execute anyway
end;
end;
end;
end;
end;
end;
这里的主要思想是通过使执行一次跳过一个循环。这可以进一步修改,使其跳过任何循环。
答
另一种方法是使用递归。这是一个相当简化的例子,它基于将当前索引写入文本文件的代码(对不起,没有用于测试的Delphi 6):
var
F: Textfile;
procedure AnywayDoThat(const Index: array of Integer);
var
I: Integer;
begin
for I := Low(Index) to High(Index) do
Write(F, Index[I], '.');
Writeln(F);
end;
procedure Loop(Level, MaxLevel: Integer; const Index: array of Integer);
var
arr: array of Integer;
I: Integer;
L: Integer;
begin
if Level < MaxLevel then begin
L := Length(Index);
SetLength(arr, L + 1);
for I := 0 to L - 1 do begin
arr[I] := Index[I];
end;
for I := 1 to 100 do begin
arr[L] := I;
Loop(Level + 1, MaxLevel, arr);
end;
end
else begin
AnywayDoThat(Index);
end;
end;
procedure Main();
var
k: Integer;
I: Integer;
Index: array of Integer;
begin
AssignFile(F, 'c:\Temp\test.txt');
Rewrite(F);
k := 2;
SetLength(Index, 1);
for I := 1 to 100 do begin
Index[0] := I;
Loop(1, 5 - k, Index);
end;
Close(F);
end;
您确定您已经正确理解了赋值? –
(邪恶的goto声明正在看这个问题) –
'如果k> 0,那么对于k1:= 1至100,如果k> 1,则开始,然后对于k2:=等等。 –