Autor |
Beitrag |
THF
      
Beiträge: 110
Vista
Delphi 2005 professional
|
Verfasst: 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.
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 begin for Schleife2 := 1 to Y do begin for Schleife3 := 1 to W do begin for Schleife4 := 1 to Z do begin end; end; end; end; end; |
Gruß
THF
Zuletzt bearbeitet von THF am Do 14.04.05 22:18, insgesamt 1-mal bearbeitet
|
|
Diabele$
      
Beiträge: 53
|
Verfasst: Do 14.04.05 20:36
Kann es sein, dass du bei dem Quelltext nicht sehr auf Übersichtlichkeit geachtet hast?
Ich muss sagen, dass es sich doch schwer lesen lässt.
|
|
THF 
      
Beiträge: 110
Vista
Delphi 2005 professional
|
Verfasst: 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 
      
Beiträge: 110
Vista
Delphi 2005 professional
|
Verfasst: 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 begin for Schleife2 := 1 to Y do begin for Schleife3 := 1 to W do begin for Schleife4 := 1 to Z do begin 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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 
      
Beiträge: 110
Vista
Delphi 2005 professional
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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..3] of 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 
      
Beiträge: 110
Vista
Delphi 2005 professional
|
Verfasst: 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 
      
Beiträge: 110
Vista
Delphi 2005 professional
|
Verfasst: 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 begin for Schleife2 := 1 to Y do begin for Schleife3 := 1 to W do begin for Schleife4 := 1 to Z do begin end;
end;
end;
end; end; |
Vielleicht kann mir jemand helfen wie man das ausdrücken kann.
Gruß
THF
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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 
      
Beiträge: 110
Vista
Delphi 2005 professional
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Sa 16.04.05 12:53
|
|
THF 
      
Beiträge: 110
Vista
Delphi 2005 professional
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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..3] of 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); 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; |
Zuletzt bearbeitet von delfiphan am Sa 16.04.05 13:14, insgesamt 1-mal bearbeitet
|
|
THF 
      
Beiträge: 110
Vista
Delphi 2005 professional
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Sa 16.04.05 13:15
Siehe oben (hab's kommentiert und erweitert).
|
|