AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zur Rekursion

Ein Thema von Hannes22549 · begonnen am 8. Nov 2007 · letzter Beitrag vom 10. Nov 2007
Antwort Antwort
Seite 1 von 2  1 2      
Hannes22549

Registriert seit: 16. Nov 2005
Ort: Potsdam
20 Beiträge
 
Delphi 7 Professional
 
#1

Frage zur Rekursion

  Alt 8. Nov 2007, 15:15
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...
Achtung!!! Anfänger am Start!!!
  Mit Zitat antworten Zitat
Hannes22549

Registriert seit: 16. Nov 2005
Ort: Potsdam
20 Beiträge
 
Delphi 7 Professional
 
#2

Re: Frage zur Rekursion

  Alt 8. Nov 2007, 16:17
Hey, bitte nicht übergehen! Das ist für mich sehr wichtig!
Achtung!!! Anfänger am Start!!!
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Frage zur Rekursion

  Alt 8. Nov 2007, 16:30
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.

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


MrSpock
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Frage zur Rekursion

  Alt 8. Nov 2007, 16:34
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
Klaus
  Mit Zitat antworten Zitat
Hannes22549

Registriert seit: 16. Nov 2005
Ort: Potsdam
20 Beiträge
 
Delphi 7 Professional
 
#5

Re: Frage zur Rekursion

  Alt 8. Nov 2007, 17:39
In dem Wahr-Array sind die Elemente true, die noch nicht verwendet wurden und die anderen stehen auf false...
Achtung!!! Anfänger am Start!!!
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Frage zur Rekursion

  Alt 9. Nov 2007, 04:08
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#7

Re: Frage zur Rekursion

  Alt 9. Nov 2007, 07:21
Hallo
Die Fehlerursache liegt NICHT an der größe von merk. Das problem liegt an zaeler noch 0 beim ersten aufruf von merk[tiefe,1,zaeler]:=zahl[i]; //Zahlenpaar merken da der index eigntlich bei 1 beginnt ...

übrigens hilft da der compiler mit eingeschalteter Bereichsprüfung ...
Peter Schaible
  Mit Zitat antworten Zitat
Hannes22549

Registriert seit: 16. Nov 2005
Ort: Potsdam
20 Beiträge
 
Delphi 7 Professional
 
#8

Re: Frage zur Rekursion

  Alt 9. Nov 2007, 15:55
Vielen Dank! Hab es jetzt aber anders gelöst...
Achtung!!! Anfänger am Start!!!
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#9

Re: Frage zur Rekursion

  Alt 9. Nov 2007, 21:26
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...
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Frage zur Rekursion

  Alt 10. Nov 2007, 10:53
Hallo Grenzgänger,

ist Deine Shift-Taste kaputt?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz