Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Frage zur Rekursion (https://www.delphipraxis.net/103020-frage-zur-rekursion.html)

Hannes22549 8. Nov 2007 14:15


Frage zur Rekursion
 
Hi, also ich suche eine Prozedur, die die Zahlen aus einer ListBox in Zweiergruppen anordnet. D.h. in der ListBox stehen die Zahlen 1, 3, 5, 7. Dann soll in dem Arry festgehalten werden: [1,3 ; 5,7] [1,5 ; 3,7] [1,7 ; 3,5]. Also jedes mit jedem. Mein Code sieht dazu so aus:

Delphi-Quellcode:
procedure TForm1.BitBtn2Click(Sender: TObject);
var wahr:array[1..100] of boolean;
    zahl:array[1..100] of real;
    merk:array[1..50,1..2,1..1280] of real;
    max:Integer;
    i,l:Integer;
    zaeler:Integer;

  procedure rek(wahr:array of boolean;tiefe:integer);
  var l:Integer; //Prüfvariable
      i,ii:Integer;
  begin
    ShowMessage('Tiefe '+IntToStr(tiefe));
    l:=0;
    for i:=1 to max do
      if wahr[i]
        then l:=l+1;
    if l<2               //Prüfung ob noch 2 leere vorhanden sind
      then begin
        zaeler:=zaeler+1;
        exit;
      end
        else begin
          for i:=1 to max-1 do begin
            if wahr[i] then begin       //wenn der Platz noch frei ist...
              wahr[i]:=false;
              ShowMessage('Max'+IntToStr(max));
              ShowMessage('1.'+IntToStr(i));
              for ii:=i+1 to max do begin
                if wahr[ii] then begin
                  wahr[ii]:=false;
                  ShowMessage('2.'+IntToStr(ii));
                  merk[tiefe,1,zaeler]:=zahl[i]; //Zahlenpaar merken
                  merk[tiefe,2,zaeler]:=zahl[ii];
                  rek(wahr,tiefe+1);
                end;
              end;
            end;
          end;
        end;
  end;

begin
  max:=ListBox1.Count;
  for i:=1 to max do begin
    zahl[i]:=StrToFloat(ListBox1.Items.Strings[i-1]);
    wahr[i]:=true;
  end;

  zaeler:=0;
  rek(wahr,1);
end;
Wo ist mein Fehler? Es kommt Stacküberlauf...

Danke schon mal im Voraus!

P.S.: Sorry, ich bin noch Anfänger...

Hannes22549 8. Nov 2007 15:17

Re: Frage zur Rekursion
 
Hey, bitte nicht übergehen! Das ist für mich sehr wichtig!

MrSpock 8. Nov 2007 15:30

Re: Frage zur Rekursion
 
Hallo Hannes,

auf die Schnelle habe ich nichts finden können, aber beim Stacküberlauf ist es so, dass die Abbruchbedingung offensichtlich nicht erreicht wird. Wenn ich das richtig sehe soll die Rekursion aufhören, sobald l<2 ist. Wird diese Bedingung vielleicht nie erreicht?

Übrigens ist das pushen nach so kurzer Zeit nicht erwünscht. :warn:

Was soll denn wahr[i]=true logisch bedeuten? Ist der Platz dann noch frei oder schon besetzt?

Klaus01 8. Nov 2007 15:34

Re: Frage zur Rekursion
 
Hallo Hannes,

einen Stacküberlauf bei rekursive Funktionen deutet ganz stark darauf hin
das eine Endlosschleife ruchlaufen wird.
Du kannst Dein Programm ja einmal schrittweise ausführen
(am besten mit einem kleinen Array) und Dir die Abbruchbedingungen anschauen.

Grüße
Klaus

Hannes22549 8. Nov 2007 16:39

Re: Frage zur Rekursion
 
In dem Wahr-Array sind die Elemente true, die noch nicht verwendet wurden und die anderen stehen auf false...

MrSpock 9. Nov 2007 03:08

Re: Frage zur Rekursion
 
Hallo Hannes,

es liegt an deinem Array Merk, der, weil du ihn als lokale Variable definiert hast, auf dem Stack angelegt wird. Er hat 100*1280*48 Bits. Du kannst entweder die MaxStackSize unter Projektoptionen hochsetzen oder Merk nicht lokal sondern als Array von Form1 oder global definieren.

peschai 9. Nov 2007 06:21

Re: Frage zur Rekursion
 
Hallo
Die Fehlerursache liegt NICHT an der größe von merk. Das problem liegt an zaeler noch 0 beim ersten aufruf von
Delphi-Quellcode:
merk[tiefe,1,zaeler]:=zahl[i]; //Zahlenpaar merken
da der index eigntlich bei 1 beginnt ...

übrigens hilft da der compiler mit eingeschalteter Bereichsprüfung ...
:cheers:

Hannes22549 9. Nov 2007 14:55

Re: Frage zur Rekursion
 
Vielen Dank! Hab es jetzt aber anders gelöst...

grenzgaenger 9. Nov 2007 20:26

Re: Frage zur Rekursion
 
ohne mal unhöflich zu erscheinen, du scheinst das prinzip der rekusion noch nicht verstanden zu ahben. wenn das eine schulaufgabe war, ist das ergebnis schlicht ungenügend....

denk mal von vorne drüber nach ... undbeschäftige dich mit dem gedanken der rekursion... falls du dann noch probleme hast, oder falls das doch nicht zutrifft, meld dich einfach wieder hier...

MrSpock 10. Nov 2007 09:53

Re: Frage zur Rekursion
 
Hallo Grenzgänger,

ist Deine Shift-Taste kaputt? :duck:

MrSpock 10. Nov 2007 16:40

Re: Frage zur Rekursion
 
Hallo peschai,

das ist ein zusätzlicher Fehler, der aber nicht zu der Fehlermeldung StackOverflow führt. Ich habe den Code einmal kopiert und den Array sowie die Funktion rek global definiert. Dann tritt der StackOverflow Fehler nicht mehr auf. Dieser trat übrigens vorher bereits bei der ersten Anweisung in der Prozedur rek auf und nicht beim Zugriff auf das 0-te (nicht definierte) Element.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 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