Rekursion und Iteration (3)


Die Routine copytail  hat nun nur noch Wertparameter, und sie ist rechtsrekursiv; daher können wir die Rekursion schematisch  entfernen:
PROCEDURE copytail(l, q: liste):
BEGIN IF l^.nach <> NIL 
      THEN NEW(q^.nach); q := q^.nach; l := l^.nach;
           q^.wert := l^.wert; copytail(l, q);
      ELSE q^.nach := NIL;
      END;
END copytail;

PROCEDURE copytail(l, q: liste):
BEGIN WHILE l^.nach <> NIL 
      DO NEW(q^.nach); q := q^.nach; l := l^.nach;
         q^.wert := l^.wert; 
      END; 
      q^.nach := NIL;
      END;
END copytail;
Die Routine copytail  ist nun nicht mehr rekursiv und wird nur noch einmal aufgerufen; wenn wir ihren Rumpf anstelle ihres Aufrufs nach copy  kopieren, brauchen wir noch eine Hilfszelle für ihren (ehemaligen) Parameter q (den wir deshalb auch schon so genannt haben), und den wir einmal mit p besetzen.
PROCEDURE copy(l: liste; VAR p: liste):
VAR q: liste;
BEGIN IF l <> NIL 
      THEN NEW(p); q := p; q^.wert := l^.wert; 
           WHILE l^.nach <> NIL 
           DO NEW(q^.nach); q := q^.nach; l := l^.nach;
              q^.wert := l^.wert; 
           END; 
           q^.nach := NIL;
      ELSE p := NIL;
      END;
END copy;
Diese Routine ist bis auf Details identisch mit der früher angegebenen, ad hoc  geschriebenen Version; das ist sehr beruhigend.


zurück | Inhalt | Index | vor | Vorlesung

Klaus Lagally, 22. Februar 2000, 19:36