Bei der rekursiven Zerlegung eines
Problems in kleinere Teilprobleme
tritt ein Sonderfall häufig auf (leider nicht oft genug),
den wir rechtsrekursiv nennen,
und der sich in eine effiziente nichtrekursive iterative
Lösung umwandeln läßt:
Problemist regulär (Klasse 3) und läßt sich in einen regulären Ausdruck umwandeln:lösedirekt
Problemreduziere Problem
ProblemAls Pseudo-Programm entspricht das der rekursiven Fassung(reduziere)* lösedirekt
PROCEDURE loese(P: Problem; VAR E: Ergebnis);
BEGIN IF NOT direktloesbar(P)
THEN P := Teilproblem(P); loese(P, E);
ELSE E := loesedirekt(P);
END;
END loese;
Wichtig ist, daß hier P, die Beschreibung der Probleminstanz,
Wertparameter ist,
und daß der rekursive Aufruf genauso wie der Erstaufruf aussieht;
dem entspricht die iterative Form:
PROCEDURE loese(P: Problem; VAR E: Ergebnis);
BEGIN WHILE NOT direktloesbar(P)
DO P := Teilproblem(P);
END;
E := loesedirekt(P);
END loese;