Autor Beitrag
THF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Vista
Delphi 2005 professional
BeitragVerfasst: Do 14.04.05 20:06 
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.

ausblenden 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


Zuletzt bearbeitet von THF am Do 14.04.05 22:18, insgesamt 1-mal bearbeitet
Diabele$
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 53



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Vista
Delphi 2005 professional
BeitragVerfasst: 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


Zuletzt bearbeitet von THF am Do 14.04.05 22:25, insgesamt 1-mal bearbeitet
THF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Vista
Delphi 2005 professional
BeitragVerfasst: Do 14.04.05 22:14 
Hallo,

ich möchte das Ganze etwas vereinfacht darstellen.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Vista
Delphi 2005 professional
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 15.04.05 11:58 
Das hier:
ausblenden 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:
ausblenden 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;


Zuletzt bearbeitet von delfiphan am Fr 15.04.05 19:30, insgesamt 1-mal bearbeitet
THF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Vista
Delphi 2005 professional
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Vista
Delphi 2005 professional
BeitragVerfasst: 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 :
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Vista
Delphi 2005 professional
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 16.04.05 12:53 
Und wieso sollte das mit Funktionsrekursionen nicht gehen?

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Vista
Delphi 2005 professional
BeitragVerfasst: 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


Zuletzt bearbeitet von THF am Sa 16.04.05 13:08, insgesamt 1-mal bearbeitet
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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.

ausblenden 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;

=
ausblenden 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;


Zuletzt bearbeitet von delfiphan am Sa 16.04.05 13:14, insgesamt 1-mal bearbeitet
THF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Vista
Delphi 2005 professional
BeitragVerfasst: 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 ?

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


Gruß

THF
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 16.04.05 13:15 
Siehe oben (hab's kommentiert und erweitert).