如何在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。

+0

您确定您已经正确理解了赋值? –

+1

(邪恶的goto声明正在看这个问题) –

+1

'如果k> 0,那么对于k1:= 1至100,如果k> 1,则开始,然后对于k2:=等等。 –

你可以使用下面的技巧

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;