Übung: Algorithmen und Datenstrukturen SS 2007

Werbung
Übung: Algorithmen und Datenstrukturen
SS 2007
Prof. Lengauer
Sven Apel, Michael Claÿen, Christoph Zengler, Christof König
Blatt 1
Votierung in der Woche vom 23.04.0727.04.07 Aufgabe 1
Von-Neumann-Modell
Welche Funktion wird vom folgenden Programm berechnet? Verwenden Sie für
diese Aufgabe den Befehlssatz für Von-Neumann-Rechner, wie angegeben auf
Folie 29 Befehle in Kapitel 1 der Vorlesungsfolien.
01
read
02
store(0)
03
addAbs(1)
04
mult(0)
05
divAbs(2)
06
print
Überlegen Sie sich welchen Nutzen diese Funktion hat.
Lösung: Diese Funktion berechnet die Summe der natürlichen Zahlen von
m,
wobei
m
die Eingabe ist:
f (m) =
1 bis
m(m+1)
.
2
01
read
akk = m
02
store(0)
speichere Eingabe in Speicherregister 0
03
addAbs(1)
addiere 1 zu Akkumulator -> akk=m+1
04
mult(0)
multipliziere Akkumulator mit Register 0 -> akk=m*(m+1)
05
divAbs(2)
dividiere Akkumulator durch 2 -> akk=m*(m+1)/2
06
print
Ausgabe des Ergebnisses
1
Aufgabe 2
Die Fakultät
n!
Von-Neumann-Modell
einer natürlichen Zahl
n
ist wie folgt deniert:
n! = 1 · 2 · . . . · (n − 1) · n
für
n≥0
und
0! = 1
Schreiben Sie unter Verwendung des Befehlssatzes für Von-Neumann-Rechner
(Folie 29 Befehle) ein Programm, das die Fakultät einer gegebenen Zahl
berechnet und mittels
n
mittels
read
print
n
ausgibt. Am Anfang soll das Programm den Wert
einlesen. Folgende Dinge sind zu beachten:
•
Ein Test auf sinnvolle Werte (nicht negativ) ist nicht notwendig.
•
Der Sonderfall
•
Überlegen Sie sich wie man den Akkumulator von einem undenierten
0! = 1
ist zu beachten.
Zustand auf Null setzen kann.
Lösung: Folgende Bedeutungen sind den verwendeten Registern zugeordnet:
Adresse
Wert
0
Zähler
1
Fakultät
Das Programm speichert die Eingabe in die Speicherzelle
1.
Nach einem Test
auf Eingabe gleich Null beginnt die Schleife zur Berechnung der Fakultät. Am
Ende wird das Zwischenergebnis aus Register
01
read
1
in den Akkumulator geladen.
Eingabe in den Akkumulator
02
jumpzero(13)
Springe an das Ende für Eingabe x = 0
03
store(1)
Speichern der Eingabe in Speicherzelle 1 (Fakultät = 1)
04
subAbs(1)
Dekrementieren des Zählers (Beginn der Schleife)
05
jumpzero(11)
Falls Zähler = 1 springe an das Ende (Abbruch der Schleife)
06
store(0)
Speichern des Zählers in Speicherzelle 0
07
mult(1)
Multiplizieren: Akkumulator = Zähler * Fakultät
08
store(1)
Produkt merken in Speicherzelle 1 (Fakultät = Akkumulator)
09
load(0)
Laden des Zählers in den Akkumulator
10
jumpgtz(4)
Unbedingter Sprung nach 4 (der Akkumulator ist hier niemals 0)
11
load(1)
Ergebnis in den Akkumulator laden (Akkumulator = Fakultät)
12
jumpgtz(14)
Sprung an das Ende
13
addAbs(1)
Sonderfall: für die Eingabe x=0 ist das Ergebnis '1'
14
print
Ausgabe des Ergebnisses
2
Herunterladen