Stack-Überlauf-Fehler-java
Ich versuche, ein problem zu lösen, der fordert, für die rekursive backtracking und meine Lösung erzeugt einen stackoverflow Fehler. Ich verstehe, dass dieser Fehler deutet Häufig auf eine schlechte Abbruchbedingung, aber meine ternimation Zustand korrekt angezeigt wird. Ist es alles andere als eine schlechte Abbruchbedingung das würde wahrscheinlich dazu führen, dass ein stackoverflow-Fehler? Wie kann ich herausfinden, was das problem ist?
EDIT: sorry, habe versucht zu posten den code, aber es ist zu hässlich..
- Wir würden uns freuen, Ihnen zu helfen, wenn Sie zeigen uns den code...
- Schlechte Terminierung Bedingungen + Tiefe rekursionen.
- Es würde helfen, wenn du gepostet hast, welches problem Sie versuchen zu lösen, den code, den Sie derzeit verwenden, um es zu lösen, und was die erwarteten Ergebnisse/output.
- Der Zustand könnte nicht schlecht sein in eine abstrakte versponnen Sinn. Aber es braucht zu viele rekursive Aufrufe selbst zu lösen innerhalb der Grenzen der Sprache und der hardware.
- Ich möchte nach dem code, aber es ist ein kompliziertes problem, und ich würde posten, um den gesamten text es........
- es ist Ihre Frage, wenn Sie können nicht die Mühe machen, noch erklären Sie es dann, warum sollten wir stören, beantworten Sie?
- Ich habe nicht Sie bitten, mein problem zu lösen für mich. Ich bat um Ratschläge, wie, um herauszufinden, wie es zu lösen mich. Sie wissen mehr über welche Arten von Dingen kann zu einem stackoverflow error wäre auch hilfreich.
- Instrument Ihrem code zu drucken, wie oft eine Rekursion, und ob der Zustand beenden wirklich beendet wird (d.h., einlegen viel System.aus.println ist in deinem code)
- "Tiefe rekursionen" in zu viele Möglichkeiten/Anrufe im rekursiven Fall?
- Schauen Sie unter: stackoverflow.com/questions/214741/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als @irreputable sagt, selbst wenn Ihr code eine korrekte Abbruchbedingung, könnte es sein, dass das problem einfach zu groß für den stack (so dass der Stapel erschöpft ist, bevor der Zustand erreicht ist). Es gibt auch eine Dritte Möglichkeit: die, dass Ihr Rekursion wieder in einer Schleife. Zum Beispiel, in einer Tiefe-zuerst-Suche durch einen Graphen, wenn Sie vergessen zu markieren Knoten als "besucht", werden Sie am Ende gehen in Kreise, der Rückgriff auf die Knoten, die Sie bereits gesehen haben.
Wie können Sie bestimmen, welche dieser drei Situationen, die Sie sind? Versuchen Sie, einen Weg zu beschreiben, die "Position" von jedem rekursiven Aufruf (dies wird in der Regel beinhalten die Parameter für die Funktion). Zum Beispiel, wenn Sie schreiben einen Graphen-Algorithmus, wo eine Funktion ruft sich selbst auf benachbarten Knoten, dann den Namen des Knotens oder von Knoten-index ist eine gute Beschreibung, wo die rekursive Funktion ist. In der Spitze der rekursiven Funktion drucken können Sie die Beschreibung, und dann wirst du sehen, was die Funktion tut, und vielleicht können Sie sagen, ob es das richtige tut oder nicht, oder ob es geht im Kreise. Sie können auch speichern Sie die Beschreibungen in einer HashMap, um zu erkennen, ob Sie nun in einem Kreis.
Statt mit Rekursion, konnte man immer eine Schleife verwendet einen stack. E. g. anstelle von (pseudo-code):
Verwenden:
Kurz gesagt, simulieren die Rekursion durch speichern des Status in einem lokalen stack.
Können Sie die Option-Xss-option, geben Sie Ihrem stack mehr Speicher, wenn Ihr problem ist zu groß, um fix in die Standard-stack-limit-Größe.
Als die anderen Kerle schon erwähnt, es könnte einige Gründe haben:
Dein Speicher ist zu klein, um die Anzahl der rekursiven Aufrufe in den stack. Große Fibonacci-zahlen könnte gut sein, Beispiel hier. Nur zur info Fibonacci ist wie folgt (manchmal beginnt bei null):
Wenn Ihr code korrekt ist, dann wird der stack ist einfach zu klein für Ihr problem. Wir haben keine echte Turing-Maschinen.
Gibt es zwei common-coding-Fehler verursachen könnten, das Programm in eine Endlosschleife (und somit zu einem stack-überlauf):
Beispiel:
Ansonsten ist dein Programm kann nur ordnungsgemäß funktionieren, und der stack ist zu klein.