Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Rekursive Funktion


martin300 - Mi 20.08.08 14:46
Titel: Rekursive Funktion
Hallo,

bei einer Rekursiven Funktion würde ich gerne sobald ein passendes Ergebnis
geliefert wird abbrechen. Wie kann der Abbruch generell realisiert werden?

Als Beispiel habe ich folgende Funktion. Sie soll nur zum besseren Verständnis sein.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function Element.getit(suche: Integer; wert : Integer; anzahl : Integer) : Integer;
var
  i : Integer;
begin
  inc (anzahl);
  if (anzahl > 10then
  begin
    result := -1;
    exit;
  end;
  if (suche = wert) then
  begin
    result := anzahl;
    exit;
  end;
  if (suche > wert) then
    getit(suche-1,wert, anzahl);

  if (suche < ziffer) then
    getit(suche+1,wert, anzahl);
end;


Tilman - Mi 20.08.08 14:53
Titel: Re: Rekursive Funktion
user profile iconmartin300 hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
  if (suche > wert) then
    getit(suche-1,wert, anzahl);


An dem teil kann man es erkennen:
Wenn suche > wert wird mit suche - 1 fortgesetzt. Irgendwann ist suche = wert und die Rekursion wird nicht weiter ausgeführt -> sie bricht also ab.

Mit 2 verschiedenen Bedingungen, wie in deinem Beispiel, wird es schwierig: du musst gewährleisten dass die Rekursion immer abbricht. Woher Ziffer kommt ist mir übrigens schleierhaft.

Grüße,
tilman


martin300 - Mi 20.08.08 15:14

Das war ein Tippfehler, soll natürlich "wert" sein.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function Element.getit(suche: Integer; wert : Integer; anzahl : Integer) : Integer;
var
  i : Integer;
begin
  inc (anzahl);
  if (anzahl > 10then
  begin
    result := -1;
    exit;
  end;
  if (suche = wert) then
  begin
    result := anzahl;
    exit;
  end;
  if (suche > wert) then
    getit(suche-1,wert, anzahl);

  if (suche < wert) then
    getit(suche+1,wert, anzahl);
end;


Mir geht es dabei um die Abbruchbedingung. Die Funktion ruft sich immer wieder selbst auf solange keine Abbruch ( in diesem Fall, Anzahl der Versuche od. gefundener Wert zutrifft). Trifft das Ergebnis zu wird wieder aus den Funktionen herausiteriert. Problem dabei das Ergebnis wird immer wieder überschrieben. Wie löse ich das? Mich würde eine allgemeine Lösung interessieren.


baka0815 - Mi 20.08.08 15:17

Wie wär's mit folgendem?

Delphi-Quelltext
1:
2:
3:
4:
5:
  if (suche > wert) then
    Result := getit(suche-1,wert, anzahl);

  if (suche < wert) then
    Result := getit(suche+1,wert, anzahl);


Delete - Mi 20.08.08 15:18

mit While oder?

Delphi-Quelltext
1:
2:
  while gehtesmirgut=TRUE do
   Juhuuu! ;
:D


Tilman - Mi 20.08.08 15:20

Du hast vergessen das ergebnis von getit result zuzuweisen seh ich grade ;)
// ah mal wieder zu spät ^^


martin300 - Mi 20.08.08 15:31

Super danke.