Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schleifen-Verschachtelungs-Problem (https://www.delphipraxis.net/150439-schleifen-verschachtelungs-problem.html)

TheGame1492 16. Apr 2010 15:52


Schleifen-Verschachtelungs-Problem
 
Ich möchte eine verschachtelte Schleife schreiben, wo die Tiefe der Schleife dynamisch sein soll, also als Beispiel

Delphi-Quellcode:
_begin:=1;
_end:=3;

list := TStringList.Create;

for i := _begin to _end do
  for j := _begin to _end do
    for k := _begin to _end do
      for l := _begin to _end do
        begin
          list.Add(IntToStr(i)+'|'+IntToStr(j)+'|'+IntToStr(k)+'|'+IntToStr(l));
        end;

Ergebnis:
---------

1|1|1|1
1|1|1|2
1|1|1|3
1|1|2|1
1|1|2|2
1|1|2|3
.
.
.

bis

.
.
.
3|3|2|3
3|3|3|1
3|3|3|2
3|3|3|3


Dies wäre eine Tiefe von 4. Dazu benötigt werden 4 For-Schleifen, wie kann ich das jetzt aber machen, wenn ich zB eine Tiefe von 10 haben möchte,


beispiel:
1|1|1|1|1|1|1|1|1|1
1|1|1|1|1|1|1|1|1|2
1|1|1|1|1|1|1|1|1|3
1|1|1|1|1|1|1|1|2|1
1|1|1|1|1|1|1|1|2|2
1|1|1|1|1|1|1|1|2|3
.
.
.


ohne jetz 10 For-Schleifen zu benutzen, irgendwie steh ich da auf dem Schlauch :(

wicht 16. Apr 2010 15:58

Re: Schleifen-Verschachtelungs-Problem
 
Was genau hast du denn damit vor?
Dein Problem lässt sich sicherlich lösen, aber der Ansatz ist falsch/nicht der beste, denke ich.

Wolfgang Mix 16. Apr 2010 16:01

Re: Schleifen-Verschachtelungs-Problem
 
Einfacher als mit For-Schleifen wird es wohl nicht funktionieren.
Alle anderen Schleifentypen sind dafür IMHO umständlicher.

himitsu 16. Apr 2010 16:04

Re: Schleifen-Verschachtelungs-Problem
 
Am Einfachsten du nutzt ein paar rekursive Aufrufe einer Funktion.

Delphi-Quellcode:
procedure Test(Start, Ende, Rekursion: Integer; SL: TStrings);
  procedure Aufruf(Start, Ende, Rekursion: Integer; SL: TStrings; const S: String);
  var
    i: Integer;
  begin
    if Rekursion <> 0 then
    begin
      for i := Start to Ende do
        Aufruf(Start, Ende, Rekursion - 1, SL, S + IntToStr(i));
    end else
      SL.Add(S);
  end;

begin
  Aufruf(Start, Ende, Rekursion, SL, '');
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  Test(1, 3, 4, Memo1.Lines);
end;
PS: Bei einem Memo könnte ein BeginUpdate eventuell auch nicht schaden.

TheGame1492 16. Apr 2010 16:13

Re: Schleifen-Verschachtelungs-Problem
 
Supi thx

mit der rekursion funzt es :)

Meflin 16. Apr 2010 16:14

Re: Schleifen-Verschachtelungs-Problem
 
Falls es sich bei dem gezeigten erwünschten Ergebnis nicht nur um ein dahergeholtes Beispiel handelt, geht das ganze auch (ganz unrekursiv) damit :angel:.

Delphi-Quellcode:
var
  BruteForce: TBruteForce;
begin
  BruteForce := TBruteForce.Create;
  BruteForce.NodeCount := 5; // oder 6 oder 7 oder was auch immer...
  BruteForce.ElementList := BFConstToDynArray(Numeric);
 
  // über "Ergebnisse" iterieren
  Memo1.Lines.Add(BruteForce.Value);
  while not BruteForce.Finished do begin
    Memo1.Lines.Add(BruteForce.NextValue);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz