¨Ubungsaufgaben

Werbung
Einführung in die Informatik
Wintersemester 03/04
Albert-Ludwigs-Universität Freiburg
Institut für Informatik
Prof. Dr. W. Burgard
Dipl.-Inf. M. Bennewitz & M. Veeck
Übungsaufgaben
Aufgabe 1
Gegeben sei folgende Funktion f : N → N von den natürlichen Zahlen in die natürlichen
Zahlen:

falls n = 1
 1
f (n/2)
falls n gerade
f (n) =

f (3 · n + 1) sonst
(a) Schreiben Sie eine rekursive Java-Methode, die diese Funktion implementiert.
(b) Berechnen Sie f (5). Geben Sie dabei alle Zwischenschritte an.
Aufgabe 2
Betrachten Sie folgende Java-Methode
static int G(int n){
int x;
if (n==1)
x = 1;
else {
x = n*n-1;
x += G(n-1);
}
return x;
}
Zeichnen Sie die Activation Records für den Aufruf G(4) zu dem Zeitpunkt, an dem
maximale Rekursionstiefe erreicht ist.
Aufgabe 3
1. Die folgende Methode berechnet die Transponierte einer quadratischen Matrix.
Führen Sie eine Aufwandsabschätzung für die Laufzeit in Abhängigkeit von der
Dimension n der Matrix qmatrix durch.
static QMatrix transpose(QMatrix qmatrix) {
int n = qmatrix.n;
QMatrix result = new QMatrix(n);
for (int i = 0; i < n; i++) {
result.value[i][i] = qmatrix.value[i][i];
for (int j = 0; j < i; j++) {
result.value[j][i] = qmatrix.value[i][j];
result.value[i][j] = qmatrix.value[j][i];
}
}
return result;
}
2. Das folgende Programmstück gibt alle durch ein Leerzeichen getrennten Worte eines Strings aus. Führen Sie eine Aufwandsabschätzung für die Laufzeit in Abhängigkeit
von der Länge n des Strings str durch.
int i = 0;
int j = 0;
int n = str.length();
while (i < n) {
j = i;
while ((j < n) && !(str.substring(j, j+1).equals(" "))) {
j++;
}
System.out.println(str.substring(i,j));
i = j+1;
}
2
Aufgabe 4
Betrachten Sie diese Klassenhierarchie. Geben Sie an, was in der main-Methode ausgegeben wird.
abstract class Lebewesen {
...
abstract void print();
}
class Wassertier extends Lebewesen {
...
void print() {
System.out.println("Ich bin ein Wassertier.");
}
}
class Landtier extends Lebewesen {
...
void print() {
System.out.println("Ich bin ein Landtier.");
}
}
class Mensch extends Landtier {
...
void print() {
super.print();
System.out.println("Ich bin ein Mensch.");
}
}
class Pferd extends Landtier {
Pferd() {
}
}
class Testklasse {
public static void main(String[] arg){
Landtier wesen1 = new Landtier();
wesen1.print();
Wassertier wesen2 = new Wassertier();
wesen2.print();
Landtier wesen3 = new Mensch();
wesen3.print();
Landtier wesen4 = new Pferd();
wesen4.print();
Lebewesen wesen5 = new Mensch();
wesen5.print();
}
}
3
Aufgabe 5
Betrachten Sie folgenden Programm-Code:
...
int x = -13;
int y = -120;
int z = 42;
while (x!=0 && y!=0) {
x++;
y += 4*x + z;
}
System.out.println(x*y);
...
// Zeile 123
Was wird nach Beendigung der while-Schleife ausgegeben, wenn Zeile 123 erreicht
wird? Begründen Sie Ihre Aussage.
Aufgabe 6
Gegeben sei folgendes Skelett der Klasse BinaryTreeNode:
public class BinaryTreeNode {
...
public Object content;
public BinaryTreeNode left;
public BinaryTreeNode right;
}
1. Betrachten Sie die folgenden zwei Abbildungen und schreiben Sie die Java-Anweisungen,
welche die Situation, die in der linken Abbildung dargestellt ist, in die Situation der
rechten Abbildung überführen. p,q,r sind hierbei Referenzvariablen, die Sie benutzen können.
Benutzen Sie keine anderen Methoden!
2. Was passiert mit dem Objekt, das in der rechten Abbildung durch q referenziert
wird, wenn die Anweisung q = null; ausgeführt wird? Beachten Sie, dass es
zwei Möglichkeiten gibt.
4
p
content
left
p
O1
left
right
content
right
null
null
r
r
null
null
content
q
q
O2 null
content
null
O2
null
null
...
...
...
...
Aufgabe 7
1. Schreiben Sie eine Haskell-Funktion, die eine Liste von Integer-Zahlen als Argument nimmt und als Output die Liste der darin enthaltenen geraden Zahlen liefert.
Verwenden Sie dabei nicht die filter-Funktion
2. Schreiben Sie eine Haskell-Funktion, die das maximale Element in einer Liste von
Integer-Zahlen berechnet.
Aufgabe 8
Betrachten Sie folgende Haskell-Funktionen:
merge l [] = l
merge [] l = l
merge (x:xs) (y:ys) | x<y
= x:merge xs (y:ys)
| otherwise = y:merge (x:xs) ys
square x = x * x
squareevens = map square [0,2..]
squareodds = map square [1,3..]
1. Zu welchem Wert wird der folgende Ausdruck in Haskell ausgewertet, wenn dabei
die Strategie Lazy Evaluation angewandt wird?
someExpression = take 5 (merge squareodds [2, 4, 7, 17, 19])
2. Was passiert, wenn man den folgenden Ausdruck mit Eager Evaluation (call-byvalue) auswertet:
someExpression2 = take 5 (merge squareodds squareevens)
5
Herunterladen