endrekursiv und normal rekursiv


zwei einfache Scheme - Programme zum Vergleich

; end und normal rekursiv.scm
;;; Beispiel: Fakultaet
;;; normal rekursiv:

(define
  (fakultaet n)
  (if
   (zero? n)
   1
   (* n (fakultaet (sub1 n)))))

;;; Test:
(fakultaet 5)

;;; endrekursiv mit lokaler Schleife:
(define
  (fac n)
  (let loop
    ((n n)
     (akku 1))
    (if
     (zero? n)
     akku
     (loop (sub1 n) (* n akku)))))

;;; Test:
(fac 5)

 


Die mit loop benannte let - Schleife ermöglicht uns Iteration, ohne den Akkumulator akku beim Aufruf mit übergeben zu müssen. fac selbst stellt also nur eine Aufrufhülle dar.