Aufgabe 6.4


wie bei mir jo


mach ichs in der methode bekomm ich mal was anderes dafür schon vor 5000:

Exception in thread “main” java.lang.OutOfMemoryError: Java heap space


sehr sehr interessant, schick mir mal deine .java datei per mail, dann schau ichs mir mal an und teste es bei mir


aber ob man dass array jetzt im konstruktor oder in der methode initialisiert dürfte doch egal sein? ich mein speicher brauchts ja so oder so dann…?!

  • tobi

PS: mich würd ja interessieren, ob die fehler zur übung dazugehören, also die auszumerzen? oder ob das ein nicht bedachter nebeneffekt ist?


geschickt, halt mom noch ein fehler drin in der 2ten version


beantwortet (also die dritte version :wink: )


stellt sich nur die frage wohin die antworten wandern? in mein postfach scheinbar nicht ^^


jezaba


und was ist die lösung? :wink:

also wie gesagt ich versteh ja schon nicht, warum deine identische _rec bis MAXBETRAG läuft und meine nicht… selbst wenn ich alles auskommentiere und nur noch die _rec drinsteht läuft sie nur bis 84xx


er hat die Tabelle mit lauter 0en initialisiert, man muss sie aber mit zb UNKNOWN (-1) initialisieren!

ps. schick auch du mir mal deine datei!


jo thx, habs bekommen.


done

aber das mit der tabelle bringt mir ja immer noch nix für das _rec problem?! kann das vom System/OS/etc abhängen ab wann man den Error bekommt?

  • tobi

nur wenn du weniger als 128 MB Speicher hast (was ich nicht glaube)
also deine Funktion läuft bei mir ohne Probleme, zeig mal bitte deine main, die war ja da net dabei!


public class Test {
private static int[] euro = {1,2,5,10,20,50,100,200,1000};
public static void main(String[] args) {
WechselMoeglichkeiten w = new WechselMoeglichkeiten(euro);
System.out.println(w.moeglich_dp(new Integer(args[0]), 8));
}
}

edit: irgendwie wär n chat effizienter Oo


und da bricht er bei dir sofort am anfang ab, wenn du den rec verwendest?


sowohl bei dp als auch bei rec mit zu hohen werten (bei dp etwas früher)
werte bis 6000 gehn bei beiden problemlos…


moeglich_dp geht bei mir ab 6550 schief. Irgendwo muss man doch die Stackgröße von Java einstellen können?


Ich hab gerade in moeglich_dp den Funktionsaufruf von muenzwert() ersetzt durch einen direkten array-Zugriff und schon gehts gut bis 8204 (Ergebnis: 472339103203848). Weitere Optimierungen fallen mir jetzt aber beim besten Willen nicht ein.


Das geht prima mit [m]time[/m], also z.B.:

# time java FooBar

real    0m0.313s
user    0m0.004s
sys     0m0.004s

Generell eines vorweg, ich habe den Thread jetzt nur überflogen: Dass die rekursive Methode irgendwo ihre Grenze hat, liegt daran, dass ein jeder rekursiver Methodenaufruf zusätzlichen (Stack-)Speicher belegt, der erst wieder freigegeben wird, wenn aus der Methode zurück gesprungen wird. Und irgendwann ist dann halt der Speicher mal zu Ende. Wann genau, hängt von verschiedenen Faktoren ab, JVM, Betriebssystem, physisch vorhandener Arbeitsspeicher.

Ja, kann man, und zwar mit [m]-Xss[/m] bzw. [m]-Xoss[/m], vgl. etwa http://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp (Abschnitt „Stack Size“) oder http://tns-www.lcs.mit.edu/manuals/java-tools/java.html.