Prof. Dr. M. Sommer M. Vincon Praktische Informatik 1, WS 2007/08 Übung 7 A7.1: Rekursionsschemata (4P) Geben Sie zu jeder der folgenden rekursiven Definitionen an, welchem Rekursionsschema (primitiv- rumpf-, linear- oder nichtlinear-rekursiv) sie genügt. Begründen Sie ihre Antwort! (1P) pro Aufgabenteil. 0 n=0 ⎧ a) f 1 ( n ) = ⎨ ⎩ f 1 ( n − 1 ) + n sonst T n=0 ⎧ ⎪ b) f 2 ( n ) = ⎨ F 0 < n<7 ⎪ f ( n −7 ) sonst ⎩ 2 T n=1 ⎧ ⎪ c) f 3 ( n ) = ⎨ f 3 ( n / 2 ) n%2 = 0 ⎪ f ( 3 n + 1 ) n%2 = 1 ⎩ 3 1 n≤m ⎧ ⎪ d) f 4 ( n , m ) = ⎨ n m=1 ⎪ f ( n − 1 , m ) + f ( n − 1 , m − 1 ) sonst ⎩ A7.2: Rekursion: Analyse (4P) Gegeben seien folgende Methoden: void f(int n){ if (n > 1){ if (g(n, n / 2)) System.out.println(n); f(n – 1); } } boolean g(int n, int m){ if (m > 1) return ((n % m) > 0) ? g(n, m – 1) : false; else return true; } a) (2P) Was wird ausgegeben, wenn f mit einer natürlichen Zahl n als Eingabe aufgerufen wird? b) (2P) Begründen Sie Ihre Antwort! Seite 1/2 Prof. Dr. M. Sommer M. Vincon Praktische Informatik 1, WS 2007/08 A7.3: McCarthy, Potenz-Rechnung (3P) a) (2P) Begründen Sie, wieso die mcCarthy-Funktion (siehe Folie 20 in Kapitel 10) terminiert. b) (1P) Schreiben Sie eine rekursive Java-Methode, die die Potenz xy von zwei Zahlen x und y berechnet. A7.4: Entrekursivierung (4P) Gegeben Sei die folgende rekursive Methode: double f(int x, int i, double z) { if (i > 0) { z *= x; z = f(x, i-1, z); z /= i; } return z; } Dabei wird f als erstes immer in der Form f(x, i, 1) aufgerufen. (Hinweis: Das dritte Argument ist der Zahlwert 1). a) (2P) Geben Sie eine äquivalente, nicht-rekursive mathematische Darstellung von f(x, i, 1) an. b) (2P) Geben Sie eine äquivalente iterative Methode an, die f(x, i, 1) berechnet. A7.5: Zeichnen von Strecken (5P) Betrachten Sie das Gerüst zu dieser Aufgabe, welches von der Vorlesungsseite geladen werden kann. In dieser Aufgabe wollen wir einen einfachen rekursiven Algorithmus implementieren für das Zeichnen von geraden Strecken auf einer Fläche. Die Fläche wird dabei durch das zweidimensionale Array repräsentiert und die Positionen der Punkte durch ganzzahlige Indizes angesprochen. a) (1P) Implementieren Sie in der Klasse Punkt die Methode berechneMittelpunkt, die den Mittelpunkt zwischen this und dem Punkt p2 berechnet und zurückgibt. Achten sie darauf, wie sie mit nicht ganzzahligen Rechen-Ergebnissen umgehen. b) (2P) Implementieren Sie die Methode zeichneStrecke, die die Strecke zwischen p1 und p2 rekursiv zeichnen soll. Den Punkten muss dabei gesagt werden, dass sie zu der Strecke bzw. Linie gehören (indem der entsprechende Wert in dem Array zum Beispiel auf true gesetzt wird). c) (2P) Testen Sie ihre Methoden aus Aufgabenteil a.) und b.) (auch mit mehreren Linien). Implementieren Sie die Methode gibAus zur Ausgabe der Fläche. Seite 2/2