Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Schleifenproblem


THF - Do 14.04.05 20:06
Titel: Schleifenproblem
Hallo ,

ich blicke bei meinen Schleifen in meinem Schachprogramm nicht mehr ganz durch.

Ich probiere jetzt schon tagelang die Schleifen in dem untenstehenden Code zu

vereinfachen,es funktioniert aber nicht .

Es sind vier Schleifen (Tiefe1 - Tiefe4),die ineinander übergreifen,

es könnten aber noch mehr werden.

Irgendwo ist dann immer wieder ein Fehler.

Ich weiss ,es ist alles etwas umständlich , aber es funktioniert zumindest.

Vielleicht kann mir einer zeigen , wie ich dies vereinfachen kann.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
If Tiefe= 4 then   
   
   begin      
           for  Schleife1 := 1 to X do  {Schleife 1}  
                 begin  
                    {Anweisung}  
               for Schleife2 := 1 to Y do {Schleife 2}  
                   begin  
                       {Anweisung}  
                 for Schleife3 := 1 to W do {Schleife 3}  
                      begin  
                           {Anweisung}  
                    for Schleife4 := 1 to Z do  {Schleife 4}  
                          begin  
                                {Anweisung}  
               
                              end;  
                         end;  
                     end;  
                    end;  
                  end;

Gruß

THF


Diabele$ - Do 14.04.05 20:36

Kann es sein, dass du bei dem Quelltext nicht sehr auf Übersichtlichkeit geachtet hast? :wink:

Ich muss sagen, dass es sich doch schwer lesen lässt.


THF - Do 14.04.05 21:33

Hallo,

ja stimmt schon.

Ich habe alles noch einmal vereinfacht dargestellt, damit es

verständlicher wird , was ich meine.

Die Anzahl der Schleifen hängt vom wert der Variablen 'Tiefe' ab.


Gruß

THF


THF - Do 14.04.05 22:14

Hallo,

ich möchte das Ganze etwas vereinfacht darstellen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
 If Tiefe= 4 then 
 
   begin    
           for  Schleife1 := 1 to X do  {Schleife 1}
                 begin
                    {Anweisung}
               for Schleife2 := 1 to Y do {Schleife 2}
                   begin
                       {Anweisung}
                 for Schleife3 := 1 to W do {Schleife 3}
                      begin
                           {Anweisung}
                    for Schleife4 := 1 to Z do  {Schleife 4}
                          begin
                                {Anweisung}
             
                              end;
                         end;
                     end;
                    end;
                   end;


Bei Tiefe= 10 oder 12 erhöht sich die Zahl der Schleife auf 10,12 u.s.w.


Gruß

THF


delfiphan - Do 14.04.05 22:47

1. Wo ist der Fehler
2. Was ist der Fehler
3. Korrigiere bitte die Darstellung.

Arbeite doch z.B. mit Funktionsrekursionen.


THF - Fr 15.04.05 09:34

Hallo,

die Anzahl der Schleifen hängt von dem Wert der Variablen

'Tiefe' .

Ich weiss nicht wie ich das steuern kann ?

Erkläre bitte was Funktionsrekursionen sind.

Gruß

THF


delfiphan - Fr 15.04.05 11:58

Das hier:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Var
 I1, I2, I3: Integer;
begin
 For I1 := 1 to 3 do
 begin
  Memo1.Lines.Add(Format('%d. Rekursion der Tiefe %d',[I1,1]));
  For I2 := 1 to 2 do
  begin
   Memo1.Lines.Add(Format('%d. Rekursion der Tiefe %d',[I2,2]));
   For I3 := 1 to 1 do
   begin
    Memo1.Lines.Add(Format('%d. Rekursion der Tiefe %d',[I3,3]));
   end;
  end;
 end;
end;

ist äquivalent zu:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Const
 MaxTiefe = 3;
 RekursionenBeiTiefe: array[1..3of Integer = (3,2,1);
procedure Rekursion(Tiefe: Byte);
Var
 I: Integer;
begin
 For I := 1 to RekursionenBeiTiefe[Tiefe] do
 begin
  Memo1.Lines.Add(Format('%d. Rekursion der Tiefe %d',[I,Tiefe]));
  if Tiefe < MaxTiefe then
   Rekursion(Tiefe+1);
 end;
end;
begin
 Rekursion(1);
end;


THF - Fr 15.04.05 19:14

Hallo delfiphan,

Danke für die Antwort, ich muß das erst mal ausprobieren.

Eine Procedure oder Function ruft sich selber auf ,

das nennt sich Fuctionsrekursion !

Gruß

THF


THF - Sa 16.04.05 12:30

Hallo,

funktioniert leider nicht, weil die Struktur der
Schleifen doch etwas komplizierter ist.
Die Schleife wird nach dem Ende
der untergeordneten Schleife fortgeführt.

Hier ein Beispiel :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
If Tiefe= 4 then   
   
   begin      
           for  Schleife1 := 1 to X do  {Schleife 1}  
                 begin  
                    {Anweisung Schleife 1}  
               for Schleife2 := 1 to Y do {Schleife 2}  
                   begin  
                       {Anweisung  Schleife 2}  
                 for Schleife3 := 1 to W do {Schleife 3}  
                      begin  
                           {Anweisung Schleife 3}  
                    for Schleife4 := 1 to Z do  {Schleife 4}  
                          begin  
                                {Anweisung Schleife4}  
               
                              end;  

                            {Anweisung  Schleife 3} 
                         end;  

                        {Anweisung  Schleife 2} 
                     end

                    {Anweisung  Schleife 1} 

                    end
                   end;



Vielleicht kann mir jemand helfen wie man das ausdrücken kann.

Gruß

THF


delfiphan - Sa 16.04.05 12:42

Na schau dir mal die Funktionsrekursion oben genauer an. Ist doch eigentlich ziemlich "straight-forward", wie das ganze zu erweitern ist..
Überleg's dir, dann hast du was gelernt. :)


THF - Sa 16.04.05 12:47

Hallo delfiphan,

das Problem ist das die Schleifen am Ende der untersten Schleife fortgeführt werden,

sonst wäre es gar nicht so schwer.

Kannst Du mir da nochmal helfen .

Danke !

Gruß

THF


delfiphan - Sa 16.04.05 12:53

Und wieso sollte das mit Funktionsrekursionen nicht gehen?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure Rekursion(Tiefe: Byte);  
Var  
 I: Integer;  
begin  
 For I := 1 to RekursionenBeiTiefe[Tiefe] do  
 begin  
  // Anweisung oben
  if Tiefe < MaxTiefe then  
   Rekursion(Tiefe+1);  
  // Anweisung unten
 end;  
end;

:?:


THF - Sa 16.04.05 12:59

Hallo delfiphan,

ich glaube es funktioniert nicht, weil die 'Variable I'
in allen Schleifen dieselbe ist, und wenn dann die Schleife
fortgeführt wird, dann haut das nicht hin, es müßte für jede Rekursion eine eigene Variable benutzt werden, sonst gibt es ein durcheinander.
Oder?

Gruß

THF


delfiphan - Sa 16.04.05 13:07

Nein, es gibt kein Durcheinander. I ist lokal, d.h. es wird bei jedem Aufruf eine neue Variable erzeugt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.ButtonClick(Sender: TObject);
Const
 MaxTiefe = 3;
 RekursionenBeiTiefe: array[1..3of Integer = (3,2,1);

 procedure Rekursion(Tiefe: Byte);
 Var
  I: Integer;
 begin
  For I := 1 to RekursionenBeiTiefe[Tiefe] do
  begin
   Memo1.Lines.Add(Format('%d. Rekursion der Tiefe %d',[I,Tiefe]));
   if Tiefe < MaxTiefe then
   begin
    Rekursion(Tiefe+1);
    Memo1.Lines.Add(Format('%d. Rekursion der Tiefe %d (unten)',[I,Tiefe]));
   end;
  end;
 end;

begin
 Rekursion(1); // Rekursion starten
end;

=

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.ButtonClick(Sender: TObject);
Var
 I1, I2, I3: Integer;
begin
 For I1 := 1 to 3 do
 begin
  Memo1.Lines.Add(Format('%d. Rekursion der Tiefe %d',[I1,1]));
  For I2 := 1 to 2 do
  begin
   Memo1.Lines.Add(Format('%d. Rekursion der Tiefe %d',[I2,2]));
   For I3 := 1 to 1 do
   begin
    Memo1.Lines.Add(Format('%d. Rekursion der Tiefe %d',[I3,3]));
   end;
   Memo1.Lines.Add(Format('%d. Rekursion der Tiefe %d (unten)',[I2,2]));
  end;
  Memo1.Lines.Add(Format('%d. Rekursion der Tiefe %d (unten)',[I1,1]));
 end;
end;


THF - Sa 16.04.05 13:11

Hallo delfiphan,

Danke für die Hilfe ,ich probier das nochmal.

Nur noch eine Frage, was bewirkt der Code in Zeile 19-21 ?


Delphi-Quelltext
1:
2:
3:
begin  
 Rekursion(1);  
end;


Gruß

THF


delfiphan - Sa 16.04.05 13:15

Siehe oben (hab's kommentiert und erweitert).