Übungsblatt 7

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Übungsblatt 7
Mir ist bewusst das es noch viel zu früh ist, aber schon mal ne Frage zur A 7.3 d)
Dürfen wir da nur Math.random() verwenden?
Und wieso sollten wir die überhaupt implementieren, wenn die Subdivide.java eh nicht abgegeben werden muss (mir ist bewusst das es eh nur ein Einzeiler is)?!

Stack Overflow bei Aufgabe 3
Hab auch mal ne Frage:
7.3 c ist vollständig implementiert, aber beim Testen wie auf dem Blatt angegeben schmeißt er eine StackOverflowError-Exception in der subdivideOneStep-Methode in dieser Zeile (Edge.midPoint() ist ordnungsgemäß implementiert):

protected ControlShape[] subdivideOneStep() {
[...]
Point2D d = ab.midPoint();
[...]
}

Ich weiß zwar was ein StackOverflow is, hab aber keine Ahnung wie man damit in Java umgehen sollte und v.a. woran es liegt (erledigt Java die Speicherverwaltung nicht automatisch?)
Hat jemand das gleiche Problem?


Ohne mehr Code zu sehen lässt es sich nicht sicher sagen, aber ich tippe mal auf eine Endlosrekursion. Zum Testen kannst du eine Ausgabe direkt vor den rekursiven Abstieg setzen, wenn dir dann die Konsole vollgeschrieben wird, weißt du es sicher.

Was ich als erstes prüfen würde:

  • Passt dein Rekursionsabbruch, d.h. wird in jedem Fall nach endlich vielen Schritten die Abbruchbedingung erfüllt?
  • Steht der Rekursionsabbruch an der richtigen Stelle, i.e. vor dem rekursiven Abstieg?
  • Startest du das Programm mit “passenden” Werten (also z.B. nicht unbedingt gleich depth 50000 oder resolution -1)?

also wenns in der subdivideOneStep ist wirds zu 99,9% eine Endlosrekursion sein.


Ihr dürft Math.random() verwenden. Wenn Du möchtest, dann kannst Du aber auch einen eigenen Algorithmus für Zufallszahlen verwenden :smiley:

Die Subdivide.java wird demnächst im EST mit auftauchen. Danke für diesen Hinweis!



:wink:


Danke für die Hilfe, jetz läufts. Hatte nen Fehler in der Mittelpunktsberechnung, was zu ner Endlosrekursion geführt hat^^

7.2
Hat einer von euch 7.2 gemacht ? Wie ist ihre Ergebnis ?

Meine war ;

SquareFunction: root=0.858154296875; value=-8.200109004974365E-5
AnotherFunction: root=4.264739990234375; value=-8.935517965538154E-5

Wenn ich SquareFunction.f() mit “-8.200109004974365E-5” rechne, bekomme ich 0.2500246003942568 als ergebnis, aber es sollte 0 sein, oder ?


keine sorge, das erste ergebnis ist richtig. die nullstelle ist übrigens „root“, value gibt nur die genauigkeit an:
SquareFunction: root=0.858154296875; value=-8.200109004974365E-5
fürs zweite hab ich allerdings ein anderes ergebnis. sollte es nicht auch im intervall [10,14] liegen, d.h. 10 <= root <= 14?
AnotherFunction: root=10.249755859375; value=-5.182581355143157E-5


Gelten soll f(root)=0:
SquareFunction: root=0.858154296875; value=-8.200109004974365E-5
AnotherFunction: root=10.249755859375; value=-5.182581355143157E-5


Danke für die Hilfe. Ich hatte fehler bei der Methode f in AnotherFunction.java, nach der Revision habe ich auch gleich ergebnis :slight_smile:


subdivideOneStep ist doch selbst nicht rekursiv oder?


Nein, subdivideOneStep ist nicht rekursiv. Die Methode führt ja nur einen Unterteilungsschritt durch.


Noch eine Frage :

java Subdivide depth 18 => Funktioniert aber es gibt genau 1.310.718 Point2D Objekte !!!
java Subdivide depth 19 => StackOverflow… Es gibt kein genug Arbeitsspeicher.

Java reserviert 128Mb Ram für sich. Da kein genug Arbeitsspeicher gibt, meldet java Stackoverflow fehler.

Was ist die Obergrenze für “depth” (ok, in meiner Lage ist es 18 ) und soll ich das prüfen ?


du kannst mit -Xms und -Xmx den Arbeitsspeicher erhöhen den Java verwenden soll


du kannst den Stack bzw. Heap mit „java -Xmx1G -Xss128M DeineKlasse“ erweitern

edit: java -server könnte auch was bringen, da die -server VM rekursive Funktionen aggressiver auflöst als die -client VM


Das wird sein Problem nicht lösen, da „ms“ nur der initial heap ist, und „mx“ nur der heap, um aber tiefe Rekursionen machen zu können brauchst du mehr Stack den du mit „ss“ vergrößern kannst


Genau ! Da Subdivide eine Rekursive-Methode ist, benutzt java zu viele Arbeitsspeicher. Um das Problem zu lösen, habe ich zwei Möglichkeiten;

1- Diese Methode als Iterative-Methode codieren.
2- Unnötig Objekte lösen.

aber ich kann/darf nicht beide Verfahren umsetzen. Einfach, ich lasse mein Program , wie es ist…