Technische Universität München Fakultät für Informatik Prof. Dr. M. Broy SS 2002 Übungsblatt 11 4. Juli 2002 Übungen zu Einführung in die Informatik II Aufgabe 40 Arbeiten mit dem Stack, Unterprogrammaufruf a) Arbeiten mit dem Stack: Gegeben sei der arithmetische Ausdruck 20 3 8 1 20 3 17 20 Geben Sie den Berechnungsbaum dieses arithmetischen Ausdrucks an Geben Sie ein MI-Programm zur Berechnung dieses Ausdrucks an. Verwenden Sie dabei den Stack als Zwischenspeicher! b) Unterprogrammaufruf: Geben Sie ein MI-Programm an, das für eine natürliche Zahl x die n-te Potenz berechnet. Die Berechnung der n-ten Potenz soll dabei in einem Unterprogramm mittels einer Schleife durchgeführt werden. Aufgabe 41 MI: Suchen in geordneten Binärbäumen Gegeben sei folgende (unvollständige) Java Klassendefinition für geordnete Binärbäume über den natürlichen Zahlen. class BinSearchTree { private BinSearchTree left; private BinSearchTree right; private int element; ... static BinSearchTree search(BinSearchTree b, int n) while (!isempty(b) && (b.element <> n)) if (n < element(b)) b = b.left; else b = b.right; return b; } } { Ordnungseigenschaft binärer Suchbäume (Wdh. Blatt 3): element k bezeichne das an Baumknoten k gespeicherte Datum – hier eine natürliche Zahl; Für jeden Koten k eines binären Suchbaums B muß gelten: element k element u für alle Knoten u im linken Teilbaum von k element k element u für alle Knoten u im rechten Teilbaum von k –2– a) Wie lassen sich Binärbäume der Klasse BinSearchTree auf der MI repräsentieren? b) Setzen Sie die Java Methode search, in ein MI-Unterprogramm um. Aufgabe 42 MI: Lineare Rekursion Gegeben ist die folgende Pascal-Funktion, die auf positiven ganzen Zahlen operieren soll: function ggT(a: integer;b: integer):integer; begin if a = b then ggT := a else if a > b then ggT := ggT(a-b,b) else ggT := ggT(a,b-a); end a) Geben Sie eine rekursive MI-Prozedur an, die die Funktion ggT(a,b) berechnet, wobei a und b auf dem Keller liegen. b) Veranschaulichen Sie graphisch, wie sich der Keller bei einem rekursiven Aufruf verändert. c) Geben Sie eine entsprechende repetitive MI-Prozedur an. Aufgabe 43 MI: Kaskadenartige Rekursion Binomialkoeffizienten (vgl. Buch S. 127): n m können durch folgende funktionale Rechenvorschrift berechnet werden fct binom = (nat n, nat m: n m) nat: if m 0 n m then 1 else binom(n 1,m) + binom(n 1,m 1) fi ? ? a) Die Werte n und m seien im Speicher abgelegt. Geben Sie ein MI-Programm an, dass den Binomialkoeffizienten berechnet. Beschränken Sie sich hier auf eine Befehlssequenz, die nur das Unterprogramm ohne ein aufrufendes Hauptprogramm enthält! b) Diskutieren Sie inwieweit eine Optimierung wie in Aufgabe 42 c) möglich ist. –3– Aufgabe 44 (P) MI: Suchen in (nicht geordneten) Binärbäumen In Aufgabe 41 wurde ein MI-Unterprogramm für das Suchen in geordneten Binärbäumen entwickelt. Dieses Unterprogramm hat die Ordnungseigenschaft binärer Suchbäume ausgenutzt, um das Suchen nicht-rekursiv in einer Schleife zu realisieren. Bei der Suche in nicht-geordneten Binärbäumen muss rekursiv in beiden Ästen weitergesucht werden. Setzen Sie folgende JavaMethode in ein MI-Unterprogramm um. static BinTree search(BinTree b, int n) BinTree t; if (isempty(b) || (b.element == n)) return b; else { t = search(b.left,n); if (isempty(t)) t = search(b.right,n); return t; } } {