Impressum | Kontakt
 Startseite | Kurse Projekte | Haskell | Fortbildungen | Linux | Suche

Verkürzung der Rekursion durch Akkumulatoren

Betrachte die folgende Summenfunktion: 

  -- ------ nicht optimale Lösung ----------
  summe 0 = 0
  summe n = n + summe (n-1)
  -- ---------------------------------------

Eine (teilweise verkürzte) Auswertung des Aufrufes "summe 3" ergibt: 

  summe 3
  --> 3 + summe 2
  --> 3 + 2 + summe 1
  --> 3 + 2 + 1 + summe 0
  --> 3 + 2 + 1 + 0
  --> 3 + 2 + 1
  --> 3 + 3
  --> 6

Man erkennt, dass sich der Term zunächst stark aufbläht, bevor er durch die Abbruchbedingung wieder zusammenschrumpft. Ursache dieses Verhaltens ist die Tatsache, dass der letzte Befehl der Funktion summe eine Addition ist.

Akkumulatorlösung

Wenn es gelingt, eine Funktion so umzuschreiben, dass der rekursive Selbstaufruf die letzte Aktion darstellt, dann spricht man von einer endrekursiven Funktion.

Hierzu benötigt man einen Akkumulator (eine weitere Variable), der die Zwischenergebnisse festhält und beim Erreichen der Abbruchbedingung das Endergebnis sofort liefert. Dadurch entfällt das "Zurücklaufen". Zu beachten ist dabei, dass der Akkumulator mit den richtigen Startwerten initialisiert wird. 

  -- ---------- Akkumulatorlösung ----------
  summe 0 x = x
  summe n x = summe (n-1) (x+n)
  -- ---------------------------------------

Aufruf der Funktion mit n=3:

  summe 3 0 -- Akkumulator mit 0 vorbelegen
  --> summe 2 (3)
  --> summe 1 (5)
  --> summe 0 (6)
  --> 6