Kurs:Algorithmen und Datenstrukturen/Vorlesung/Fakultätsfunktion

Aus testwiki
Version vom 26. Februar 2016, 14:30 Uhr von imported>Dirk Hünniger (hsrw)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Vorlage:Navigationsleiste/Algorithmen und Datenstrukturen

Fakultätsfunktion als imperativer Algorithmus

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

Hintergrundwissen

Fakultätsfunktion: 0!=1,x!=x(x1)!fürx>0

FACvarX,Y:int;

inputX;
Y:=1
whileX>1doY:=YX;X:=X1
outputY

Es ist:

[[FAC]](x)={x!fürx01sonst

Falls die Bedingung der while-Schleife x0 lautet, dann ist:

[[FAC]](x)={x!fürx0sonst

Gesucht ist das Ergebnis des Aufrufs FAC(3).

Die Abkürzung der while β für die Zeile ist

whileX>1doY:=YX;X:=X1

Die Signatur der Semantikfunktion ist

[[FAC]]:intint

Die Funktion ist durch Lesen von Y im Endzustand Z definiert

[[FAC]](w)=Z(Y)

Der Endzustand ist definiert durch

Z=[[α]](Z0), wobei α die Folge aller Anweisungen des Algorithmus ist.

Der initiale Zustand Z0 ist definiert als

Z0=(X=w,Y=)

Die Zustände abkürzend ohne Variablennamen sind

Z0=(w,)

Die Auswertung

Z=[[α]](Z0)

=[[α]](3,)
=[[Y:=1;whileβ]](3,)
=[[whileβ]]([[Y:=1]](3,))
=[[whileβ]](3,)Y1
=[[whileβ]](3,1)
={ZfallsZ(B)=false[[whileBdoα]]([[α]](Z))sonst
={(3,1)fallsZ(X>1)=(3>1)=false[[whileβ]]([[Y:=YX;x:=X1]](Z))sonst
=[[whileβ]]([[Y:=YX;X:=X1]](3,1))
=[[whileβ]]([[X:=X1]]([[Y:=YX]](3,1)))
=[[whileβ]]([[X:=X1]](3,3))
=[[whileβ]](2,3)
={(2,3)fallsZ(X>1)=(2>1)=false[[(whileβ)]]([[Y:=YX;X:=X1]](Z))sonst
=[[whileβ]]([[Y:=YX;X:=X1]](2,3))
=[[whileβ]]([[X:=X1]]([[Y:=YX]](2,3)))
=[[whileβ]]([[X:=X1]](2,6))
=[[whileβ]](1,6)
={(1,6)fallsZ(X>1)=(1>1)=false[[(whileβ)]]([[Y:=YX;X:=X1]](Z))sonst
=(1,6)

Schlussfolgerung

Das bedeutet Z=[[α]](Z0)

=[[α]](3,)
...
=(1,6)

Damit gilt

[[FAC]](3)=Z(Y)=6

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.


Discussion