Potenzen berechnen
Die e-te Potenz einer Zahl x lässt sich durch eine Rekursion berechnen, indem man mehrere Fälle unterscheidet:
- Wenn e keine ganze Zahl ist, wird eine Ausnahme ausgelöst.
- Wenn e gleich 0 ist, dann ist das Ergebnis 1.
- Wenn e gleich 1 ist, dann ist das Ergebnis x.
- Wenn e kleiner als 0 ist, wird der Kehrwert der (- e)-ten Potenz von x berechnet.
- Wenn e eine gerade Zahl ist, dann wird rekursiv die (e/2)-te Potenz von x berechnet und dann mit sich selbst multipliziert.
- Und wenn e eine ungerade Zahl ist, dann wird x mit der (e-1)-ten Potenz multipliziert.
So, wie in der Aufzählung der Fälle beschrieben, geht die Funktion expt vor:
(defproc expt (x e)
(cond
((not (integer? e))
(throw (quote error) "exponent must be an integer"))
((= e 0)
1)
((= e 1)
x)
((< e 0)
(/ 1 (expt x (- e))))
(t
(let
((half-e (/ e 2)))
(if
(integer? half-e)
(let
((half-expt (expt x half-e)))
(* half-expt half-expt))
(* x (expt x (- e 1))))))))
- Wenn e keine ganze Zahl ist, wird eine Ausnahme ausgelöst.
- Wenn e gleich 0 ist, dann ist das Ergebnis 1.
- Wenn e gleich 1 ist, dann ist das Ergebnis x.
- Wenn e kleiner als 0 ist, wird der Kehrwert der (- e)-ten Potenz von x berechnet.
- Wenn e eine gerade Zahl ist, dann wird rekursiv die (e/2)-te Potenz von x berechnet und dann mit sich selbst multipliziert.
- Und wenn e eine ungerade Zahl ist, dann wird x mit der (e-1)-ten Potenz multipliziert.
So, wie in der Aufzählung der Fälle beschrieben, geht die Funktion expt vor:
(defproc expt (x e)
(cond
((not (integer? e))
(throw (quote error) "exponent must be an integer"))
((= e 0)
1)
((= e 1)
x)
((< e 0)
(/ 1 (expt x (- e))))
(t
(let
((half-e (/ e 2)))
(if
(integer? half-e)
(let
((half-expt (expt x half-e)))
(* half-expt half-expt))
(* x (expt x (- e 1))))))))