Fakultätsfunktion als imperativer Algorithmus
Im Folgenden werden wir die Fakultätsfunktion als imperativen Algorithmus entwerfen.
Hintergrundwissen
Fakultätsfunktion:




Es ist:
Falls die Bedingung der while-Schleife
lautet, dann ist:
Gesucht ist das Ergebnis des Aufrufs FAC(3).
Die Abkürzung der while
für die Zeile ist
Die Signatur der Semantikfunktion ist
Die Funktion ist durch Lesen von Y im Endzustand Z definiert
Der Endzustand ist definiert durch
, wobei
die Folge aller Anweisungen des Algorithmus ist.
Der initiale Zustand
ist definiert als
Die Zustände abkürzend ohne Variablennamen sind
Die Auswertung
![{\displaystyle =[\![\alpha ]\!](3,\bot )}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/4d4a5403856c43b827f023ccee91b26114bfad7f.svg)
![{\displaystyle =[\![Y:=1;while~\beta ]\!](3,\bot )}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/037335c75fff8f8d9729dc2363623a87cdaa9685.svg)
![{\displaystyle =[\![while~\beta ]\!]([\![Y:=1]\!](3,\bot ))}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/3fa446c627fe591c0ab64dde39f6fd08a0c99d14.svg)
![{\displaystyle =[\![while~\beta ]\!](3,\bot )Y\leftarrow 1}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/459643d9f6cc1f01550ff1b7c9ab107d3e7a0cc8.svg)
![{\displaystyle =[\![while~\beta ]\!](3,1)}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/ddd7f5b84395f7118a8ec81ad6325df02821d42f.svg)
![{\displaystyle =\left\{{\begin{array}{ll}Z&falls~Z(B)=false\\\,[\![while~B~do~\alpha ']\!]([\![\alpha ']\!](Z))&sonst\end{array}}\right.}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/8b82383538b003b765c607148ad34d6a8923e40f.svg)
![{\displaystyle =\left\{{\begin{array}{ll}(3,1)&falls~Z(X>1)=(3>1)=false\\\,[\![while~\beta ]\!]~([\![Y:=Y\cdot X;~x:=X-1]\!](Z))&sonst\end{array}}\right.}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/674dc6ac4a60cc398a09019c73629904663c418f.svg)
![{\displaystyle =[\![while~\beta ]\!]([\![Y:=Y\cdot X;~X:=X-1]\!](3,1))}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/8f9ccd0ad622e97dfc4ba47ae5ff195a479e8e81.svg)
![{\displaystyle =[\![while~\beta ]\!]([\![X:=X-1]\!]([\![Y:=Y\cdot X]\!](3,1)))}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/77163f22c498e0285a042b7e188796e52ad84aba.svg)
![{\displaystyle =[\![while~\beta ]\!]([\![X:=X-1]\!](3,3))}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/9bb98a7cd897d02102943f7ae09666308de8f3d4.svg)
![{\displaystyle =[\![while~\beta ]\!](2,3)}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/5acb9206dfc90dad004476ab1d9c7cbed3929fdc.svg)
![{\displaystyle =\left\{{\begin{array}{ll}(2,3)&falls~Z(X>1)=(2>1)=false\\\,[\![(while~\beta )]\!]~([\![Y:=Y\cdot X;~X:=X-1]\!](Z))&sonst\end{array}}\right.}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/d1e0cf2772ce5143a87a174ac1be999000b93b20.svg)
![{\displaystyle =[\![while~\beta ]\!]([\![Y:=Y\cdot X;~X:=X-1]\!](2,3))}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/ab50e663d81fdf50e6884e6b0e638f9815348c9c.svg)
![{\displaystyle =[\![while~\beta ]\!]([\![X:=X-1]\!]([\![Y:=Y\cdot X]\!](2,3)))}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/2735e2d4660104b81312c9e22995267918601d51.svg)
![{\displaystyle =[\![while~\beta ]\!]([\![X:=X-1]\!](2,6))}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/f9270f44a0e604f2a8235b9ce8a67c7c6d03d041.svg)
![{\displaystyle =[\![while~\beta ]\!](1,6)}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/80dfb61a8347c03963e5e5e8fce5478ecd501345.svg)
![{\displaystyle =\left\{{\begin{array}{ll}(1,6)&falls~Z(X>1)=(1>1)=false\\\,[\![(while~\beta )]\!]~([\![Y:=Y\cdot X;~X:=X-1]\!](Z))&sonst\end{array}}\right.}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/0e1abfd85cda0503400eeb3e8a351536a12d961b.svg)

Schlussfolgerung
Das bedeutet
![{\displaystyle =[\![\alpha ]\!](3,\bot )}](../../_assets_/eb734a37dd21ce173a46342d1cc64c92/4d4a5403856c43b827f023ccee91b26114bfad7f.svg)
- ...

Damit gilt
Beobachtungen
Der Übergang von der 3. auf die 4. Zeile folgt der Definition der Sequenz, indem der Sequenzoperator in einen geschachtelten Funktionsaufruf umgesetzt wird. Nur in der 5. Zeile wurde eine Wertzuweisung formal umgesetzt,später sind sie einfach verkürzt direkt ausgerechnet. In der 7. Zeile haben wir die Originaldefinition der Iteration eingesetzt (nur mit Kürzel α' statt α, da α bereits verwendet wurde). Dies entspricht im Beispiel α' = {Y:= Y · X; X:= X - 1}. Das Z in der 7. und 8. Zeile steht für den Zustand (3,1). (In späteren Zeilen analog für den jeweils aktuellen Zustand.)Bei diesem Beispiel sieht man folgendes sehr deutlich: Die Ausführung einer while-Schleife erfolgt analog zur rekursiven Funktionsdefinition!
Literatur
Da die Vorlesungsinhalte auf dem Buch Algorithmen und Datenstrukturen: Eine Einführung mit Java von Gunter Saake und Kai-Uwe Sattler aufbauen, empfiehlt sich dieses Buch um das hier vorgestellte Wissen zu vertiefen. Die auf dieser Seite behandelten Inhalte sind in Kapitel 3.3.3 zu finden.