![]() |
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:
Wo ist mein Fehler? Es kommt Stacküberlauf...
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; Danke schon mal im Voraus! P.S.: Sorry, ich bin noch Anfänger... |
Re: Frage zur Rekursion
Hey, bitte nicht übergehen! Das ist für mich sehr wichtig!
|
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? |
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 |
Re: Frage zur Rekursion
In dem Wahr-Array sind die Elemente true, die noch nicht verwendet wurden und die anderen stehen auf false...
|
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. |
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:
da der index eigntlich bei 1 beginnt ...
merk[tiefe,1,zaeler]:=zahl[i]; //Zahlenpaar merken
übrigens hilft da der compiler mit eingeschalteter Bereichsprüfung ... :cheers: |
Re: Frage zur Rekursion
Vielen Dank! Hab es jetzt aber anders gelöst...
|
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... |
Re: Frage zur Rekursion
Hallo Grenzgänger,
ist Deine Shift-Taste kaputt? :duck: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 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