Klausur 21.2.2013


Loeblich. Noch besser / hilfreicher ist es, die Aufgaben jeweils vorher am Papier zu programmieren, weil es doch schwieriger / ungewohnter ist. Uebt das vor der Klausur - ihr tut auch uns damit einen Gefallen :wink:


Ja, hab sie aufm Papier programmiert, aber dann nochmal abgetippt. Weil einscannen nich so gut lesbar und so…

UML
Ich habe eine allgemeine Frage zu UML:

Wenn ich eine Assoziation, in Form von Code, gegeben hab, soll ich dann beim UML-Diagramm sowohl im Kasten für die Klasse und auf dem Pfeil die Bezeichnung hinschreiben oder reicht es nur auf dem Pfeil??

Beispiel:

class A{
B obj;
}

class B{}

Nein. Eine Assoziation musst du im UML-Diagramm nicht noch als zusätzliches Attribut einer Klasse darstellen, sofern du bereits die/den Assoziationsbeschreibung/-namen auf dem Pfeil stehen hast.
Auf Wikipedia findet sich ein Beispiel, das meine Aussage bestätigt:

(Die Klassenkarte zu Person enthält neben der Assoziation kein zusätzliches Attribut „KindVon“ bzw. „VaterVon“.)

5,b) Rekursion
Ich hab mal eine Frage zu 5b)

funktioniert das so:
musst du im UML-Diagramm nicht noch als zusätzliches Attribut einer Klasse darstellen, sofern du bereits die/den Assoziationsbeschreibung
if (n == null)
break;

Node nachbar := letzte Nachbar von n (den würde ich mit einen Iterator suchen)

if( nachbar == null) {
addList (p,s);
removeLast(n.neighbour);
}

for (Node N : n.neighbours) {
addList(p,s);
allPath(z,p,s);
}


Ich denke nicht.

Hier mal was mir dran auffällt:

  • Du fügst nie etwas in die Liste p ein
  • wo kommt das z bei deinem rekursiven Aufruf her? (Oder ist das nur ein tippfehler?)
  • du prüfst nicht auf den letzten Knoten den du in die Liste p einfügen musst (Result)
  • aus was willst du mit break; rausspringen?

Es gibt schon eine Lösung im Wiki. Evtl. hilft dir ja die weiter.

Das ganze ist eigentlich nur eine Tiefensuche. Schau dir dazu nochmal die Folien an bzw. Wikipedia.


Eine Frage zum Schreibtischlauf in Aufgabe 3.
In der Lösung im Wiki steht hier bei fld[0][1] die Werte “0,1” und null.
Aber tritt im finally-Block der bar()-Methode nicht eine IndexOutOfBoundsException auf, weshalb durch den Code in der catch-Klausel in los() fld[0][1] auf “Grmbl” gesetzt wird?

Klausur WS2012
Hallo miteinader, ich hoffe jemand kann mir zur Aufgabe 5b) die musterlösung erklären…

ich verstehe nicht ganz warum im else-teil „p.removeLast()“ und "n.visited = false " durchgeführt werden… wäre jemand so nett mir zu erklären wozu das notwendig ist bzw. was das bezwecken soll?

danke schon mal im voraus! :slight_smile:


@ Volschlaf: Sorry, ich habe es editiert.

@ Sto: Ich habe zunächst den Lösungscode etwas geändert - im Prinzip macht er aber dasselbe:

void allPaths(Node n, LinkedList<Node> p, LinkedList<LinkedList<Node>> s) { if(n.visited){ return; } n.visited = true; p.addLast(n); if(n.result){ addList(p, s); } else { for(Node neighbour : n.neighbours){ allPaths(neighbour, p, s); } } p.removeLast(); n.visited = false; }

Die Methode allPaths hat als Übergabeparameter einen Knotenpunkt n, der die aktuelle Variable wiedergibt. Dazu haben wir die Liste p, wo wir alle aktuellen Variablen in einer Gleichung abspeichern. Und zum Schluss haben wir eine Liste s, wo wir alle Lösungen abspeichern.

Was in der Methode passiert, ist im Prinzip ein Backtracking. Wir setzen zunächst den Knoten auf besucht ([m]n.visited = true;[/m]). Das müssen wir machen, damit sich die ganzen Pfade nicht wiederholen, wenn wir die Methode für die Nachbarn aufrufen. Dann fügen wir den Knoten der Gleichung hinzu. Ist die Gleichung fertig ([m]if(n.result)[/m]), dann fügen wir der Gleichung der Liste aller Lösungen hinzu. Wenn die Gleichung noch nicht fertig ist, führen wir die Methode für alle Nachbarn aus. Nach dem Durchführen der Methode für alle Nachbarn kehren wir in vorherige Lösungen, weshalb wir den Knoten wieder von der Gleichung entfernen und auf unbesucht setzen. Warum machen wir das? Dafür folgendes Bsp.:

  3
1 - 0
= 2

Wir wollen, wenn wir bei der 3 beginnen, nicht nur 3-2, sondern auch 3-1 und 3-0 untersuchen. Und dafür wäre es suboptimal, wenn wir [3][-][2][1] statt [3][-][1] abspeichern. Deshalb entfernen wir die untersuchten Knoten auch von den Gleichungen. Ebenso kann es sein, dass wir mal den Knoten 2 wieder mal besuchen wollen, wenn wir 3-1=… berechnen, aber nicht dürfen, da er besucht ist. Deshalb muss der Knoten wieder auf nicht besucht gesetzt werden.


Die Frage ist ein halbes Jahr alt. :wink:
Wenn ich mich recht entsinne, wurde die Antwort ergänzt, nachdem ich gefragt hatte. Ich weiß es aber nicht mehr genau. :smiley:


ich glaube jetzt habe ich es verstanden! danke für die ausführliche erklärung :slight_smile:

… ich hätte dann alle möglichen pfade dann in der "LinkedList<LinkedList> s " abgespeichert richtig?


Noch mal ein paar Fragen zur vollständigen Induktion:

1.Mal angenommen, es wäre jetzt nicht angegeben, welche Induktionsvoraussetzungen ich hinschreiben müsste,
woher wüsste ich dann genau, welche ich brauche?
Muss ich in die Code-Zeile mit dem rekursiven Aufruf schauen und mir sozusagen raussuchen, was ich brauche?
Also in dem Beispiel:
Ich will im Induktionsschritt beweisen, dass die Gleichung auch für n+1 erfüllt ist, darum setze ich in den Code
einfach mal n+1 für n ein und sehe, dass dann dort steht “return n+1 * lf(n) - n * lf(n-1)”
lf(n) hab ich gegeben, aber lf(n-1) eben nicht, darum gehe ich auch einfach mal davon aus, dass die Summenformel
eben auch für n-1 erfüllt ist. Geht das so oder mache ich es mir da zu einfach?

  1. Woher weiß ich, ob ich als Induktionsschritt (n+1) oder (n+2) wählen soll?
    Hängt das auch wieder davon ab, wie die Methode rekursiv aufgerufen wird?
    In der Hausaufgabe zum Blatt 4 hatten wir nämlich als Induktionsschritt (n+2) gewählt und ich hab mir das so erklärt,
    dass man mit n+2 für jedes n (also auch für 0) auf jeden Fall in die Rekursion “reinrutscht”. Das wäre hier ja nicht der Fall,
    weil die Gleichung ja für alle n >= 0 erfüllt sein soll und mit 0 + 1 wird ja einfach die erste else-if-Anweisung ausgeführt.

Ich hoffe, das ist noch verständlich :slight_smile: