Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Beispiel 6.2.6
- Wir geben eine rekursive Prozedur für das Entfernen eines Elementes aus einer Liste
- an. Die entsprechende iterative Prozedur finden Sie als Beispiel 5.4.2.5 . Die folgende
- Prozedur zeigt eindrucksvoll, wie eine rekursive Lösung die
- Programmkomplexität drastisch reduzieren kann.
- procedure ListenElemEntfernen (inZahl : integer;
- var ioRefAnfang : tRefListe;
- var outGefunden : boolean);
- { entfernt aus einer Liste mit Anfangszeiger ioRefAnfang das Element mit dem Wert inZahl, bei erfolgreicher Entfernung wird outGefunden
- auf truegesetzt, sonst auf false }
- var
- Zeiger : tRefListe;
- gefunden : boolean;
- begin
- if ioRefAnfang = nil then
- gefunden := false
- else
- if ioRefAnfang^.info = inZahl then
- { Element gefunden, also entfernen }
- begin
- Zeiger := ioRefAnfang;
- ioRefAnfang := ioRefAnfang^.next;
- dispose (Zeiger);
- gefunden := true
- end
- else
- { Element noch nicht gefunden, es folgt dasrekursive Durchsuchen des Listenrestes }
- ListenElemEntfernen (inZahl, ioRefAnfang^.next, gefunden);
- outGefunden := gefunden
- end; { ListenElemEntfernen }
- Nehmen wir an wir haben eine Lineare Liste mit den Werten Adresse1 (10), Adresse2 (12), Adresse3 (20)!
- Wobei 10 die Wurzel ist und 12 der gesuchte wert ist.
- Also laufen wir das Programm das erste mal durch!
- ioRefAnfang zeigt beim ersten Aufruf auf die Wurzel der Liste!
- 1. if ioRefAnfang = nil... Trifft nicht zu
- 2. Er springt zum else Teil
- 3. if ioRefAnfang^.info = inZahl then .. Trifft nicht zu, da die gesuchte Zahl nicht in der Wurzel ist und der Aktuell wert ja 10 ist..
- 4. Er springt also in die Else Anweisung und die Funktion ruft sich nochmal selbst auf! Siehe nächste Zeile
- ListenElemEntfernen (inZahl, ioRefAnfang^.next, gefunden); ioRefAnfang^.Next zeigt hier ja Quasi noch auf Wurzel.Next, da es ein VAR-Parameter ist!
- Wir kommen in die Rekursionsebene Nr.2
- HIER BIN ICH MIR NICHT SICHER WAS PASSIERT.... (AB 2.1) Ist das Richtig???
- Erneute Ausführung der Funktion (Steht auf der 2 Zahl also in diesem Beispiel auf 12, der gesuchten Zahl)..
- 1. if ioRefAnfang = nil... Trifft nicht zu
- 2. er springt zum Else Teil und prüft ob die gesuchte Zahl in ioRefAnfang^.Info steht, was auch stimmt somit werden die Anweisungen der else Anweisung ausgeführt
- 2.1 Zeiger := ioRefAnfang; {Hier wird Zeiger auf Adresse2 (l2) gesetzt, der VAR-Variable (ioRefAnfang) wird ja nichts zugewiesen}
- 2.2 ioRefAnfang := ioRefAnfang^.next; (Adresse2 soll auf Adresse3 zeigen, allerdings wird somit auch ioRefAnfang^.Next(Wurzel) auf Adresse 3 gesetzt, wegen dem Var-Parameter)
- 3.3 dispose (Zeiger); (Speicher von Zeiger wird freigegeben)
- 3.4 gefuden := True;
- 4. outGefunden := gefunden;
- Schliesen der Rekursionsebene 2
- Nun wird in der ersten Ebene noch outGefunden auf gefunden gesetzt..
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement