Sudoku Solver funktioniert beim 2. Aufruf nicht mehr

Status
Nicht offen für weitere Antworten.

steve

Mitglied
Hallo,

ich programmiere gerade Sudoku mit integriertem Solver.

Das lösen funktioniert auch prima, bis ich ihn das zweite mal aufrufe. Dann hält er kurz vor der 6. Zeile an; mit einem StackOverflowError.

Hier der solver:
Code:
public void solve(Integer r, Integer c) {
//wenn das Sudoku noch nicht gelöst ist
		if (isValid(data) == false) {
			if (c > n - 1) { //Spalten- und Zeilenangaben überprüfen und korrigieren
				r++;
				c = 0;
			}
			if (c < 0) {
				r--;
				c = 8;
			}

			if (sudokuData[r][c] == 0) {//Falls das aktuelle Feld verändert werden darf
				data[r][c]++;//Feld setzen
				if (data[r][c] <= n) {//Falls die gesetzte Zahl nicht größer als 9 ist
					if (isNumberValid(data, r, c)) {//falls der gesetzte Inhalt gültig ist
						back = false;
						solve(r, c + 1);//nächstes Feld aufrufen
					} else {
						back = false;
						solve(r, c);
					}
				} else {
					back = true;//Schritt rückgängig machen
					data[r][c] = 0;
					solve(r, c - 1);
				}
			} else {//wenn das Feld nicht verändert werden darf: nächstes/vorheriges Feld aufrufen
				if (back == false) {
					back = false;
					solve(r, c + 1);
				} else {
					back = true;
					solve(r, c - 1);
				}
			}
		}
	}

Und so wird er aufgerufen von einer anderen Klasse aufgerufen:
Code:
	public void solveSudoku() {
		solver.setData(sudokuData.getSudokuData());//übergibt das Sudokuarray an die Solver Klasse
		solver.solveSudoku(0,0);//ruft den solver auf
		data = solver.getData();//holt sich die daten des gelösten Sudokus
		tableModel.setHoleValueAt((Object[][]) data);//übergibt dem TableModel die Daten
	}

Ich hatte zuvor noch einen Parameter: private void solve(Integer r, Integer c, Integer z).
In dem Fall hat er noch nicht mal einen Durcchgang geschafft.

Ich hoffe ihr könnt mir helfen. Ich sitze nämlich schon ein paar Tage daran.

Gruß
Steve
 

dieta

Top Contributor
Der Fehler kommt daher, dass die Methode sich rekursiv immer und immer wieder selbst aufrüft, und irgendwann einfach der Aufrufasspeicher (Stack) voll ist.
 

steve

Mitglied
Mh, aber der Algorithmus funktioniert beim 1. Mal sehr gut und löst ein bestimmtes Sudoku erfolgreich. Wenn ich ihn aber mit genau dem selben Sudoku nochmal aufrufe geht er bis zur 6. Zeile und dann ist Schluss.
 

steve

Mitglied
Kann ich den Stack irgendwie vor dem 2. Aufruf leeren oder muss ich einen optimierten Algorithmus schreiben?
 

dieta

Top Contributor
DU kannst den Stack leeren, indem du die Methoden, in die du gehst wieder verlässt. Der überfüllte Stack sieht dann so aus:

Code:
bla
  bla
    bla
      bla
        bla
          ...
            bla
und da ist dann halt irgendwann der Speicher voll mit bla.
Du musst die Methode, nach ihrem Betreten auch irgendwann wieder verlassen, damit sie aus dem Stack gelöscht werden kann (Das ist dei warscheinlichste Fehlerursache, dass du das nämlich nicht tust).
 

steve

Mitglied
Mh, ich dachte immer Methoden werden automatisch verlassen. Ich komme nämlich von der Delphi-Ecke und habe einfach übertragen. Muss ich dann am Ende der Methode immer return aufrufen, oder wie verlasse ich die Methode sonst?
 

Apo

Bekanntes Mitglied
wenn du eine void Methode hast, wo du nichts zurückgibst, brauchst du eigentlich kein return;
das return verlässt die Methode dann nur sofort an der Stelle und Java ist es egal was danach in der Methode noch stehen würde ...

oder du zwingst Java mit
Code:
System.gc();
den Speicher zu entleeren von Sachen, die nicht mehr gebraucht werden.

vielleicht hast du auch bei den anderen Methoden die du geschrieben hast etwas überflüssiges mit drin, was den Speicher vollhaut. Ich habe mal einen Solver geschrieben mithilfe vom simplen backtracking und da hatte ich 0 Speicherprobleme.
 

steve

Mitglied
Vielen Dank für die schnellen Antworten.

Ich habe es mit System.gc(); und return; versucht, aber es hat irgendwie nichts gebracht.

Deshalb habe ich einen neuen Solver geschrieben, der mir bis zu 9 rekursionsschritte pro feld spart und es funktioniert wunderbar.

Das Problem ist also umgangen, ich finde es aber trozdem komisch, dass der Aufruf von System.gc(); nach der solve() Methode nichts bringt. Naja, egal.

Vielen Dank nochmal für die Hilfe :)
 

dieta

Top Contributor
System.gc() sagt Java nur, dass es überflüssige, nicht mehr benötigte Objektreferenzen im Heap löschen soll. Der Stack bleibt davon unberührt, da die in ihm gespeicherten Daten ja auch noch gebraucht werden, damit das Programm wieder von der rekursiven Methode bla in die Methode blubb, die bla aufgerufen hat "zurückfindet".
 

steve

Mitglied
Ok, das erklärt warum System.gc() nicht funktioniert. Aber die Methode wird ja verlassen, da das Programm weiter läuft. Also müssten die lokalen Variablen eigentlich gelöscht werden, oder?
 

Apo

Bekanntes Mitglied
ich meinte das System.gc() erst nach dem ersten kompletten Durchlauf ...
aber egal
hauptsache es fkt jetzt ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Vorstellung: Sudoku - Solver Spiele- und Multimedia-Programmierung 2
B Sudoku Solver & Generator Spiele- und Multimedia-Programmierung 11
M Rekursiver Solver für Sudoku Spiele- und Multimedia-Programmierung 9
G Sudoku Solver Spiele- und Multimedia-Programmierung 3
H Sudoku Spiele- und Multimedia-Programmierung 5
H Sudoku Spiele- und Multimedia-Programmierung 12
B Sudoku Generator ohne Solerver möglich? Spiele- und Multimedia-Programmierung 20
$ sudoku eindeutig lösbar Spiele- und Multimedia-Programmierung 4
N SUDOKU! EILT! Spiele- und Multimedia-Programmierung 5
D Sudoku --- Gui/Spielbrett Spiele- und Multimedia-Programmierung 3
P Pokemon Spiel Funktioniert nicht ? Spiele- und Multimedia-Programmierung 3
D MIDIdevice open funktioniert nicht Spiele- und Multimedia-Programmierung 1
A Kollision funktioniert nicht richtig bei zu schneller Geschwindigkeit des Spielers Spiele- und Multimedia-Programmierung 0
P Teamspeak interface mit JFrame funktioniert nicht Spiele- und Multimedia-Programmierung 3
D Kollision funktioniert unten aber nicht oben Spiele- und Multimedia-Programmierung 4
N Animation funktioniert icht wie sie soll Spiele- und Multimedia-Programmierung 10
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
Damtonix Gameloop funktioniert nicht! Spiele- und Multimedia-Programmierung 6
temi libGDX Box2d ApplyTorque() funktioniert nicht Spiele- und Multimedia-Programmierung 1
M KeyListener funktioniert nicht während Timer läuft Spiele- und Multimedia-Programmierung 26
S KeyEvent funktioniert nicht, wenn Buttons dem Frame hinzugefügt werden Spiele- und Multimedia-Programmierung 7
C Export als .jar funktioniert nicht richtig (JAVA 3D) Spiele- und Multimedia-Programmierung 5
A Minecraft Minecraft, Programm funktioniert nur in Eclipse richtig Spiele- und Multimedia-Programmierung 24
F LWJGL: Licht und GL_LINES funktioniert nicht Spiele- und Multimedia-Programmierung 6
J KeyMapping funktioniert nicht Spiele- und Multimedia-Programmierung 5
J Sound einbinden funktioniert nicht Spiele- und Multimedia-Programmierung 13
D Slick Lib - Bilder einlesen funktioniert nicht Spiele- und Multimedia-Programmierung 2
M Mathetrainer - Reset Button funktioniert nicht! Spiele- und Multimedia-Programmierung 8
K Wie funktioniert hier ein Score ? Spiele- und Multimedia-Programmierung 4
O A* funktioniert, aber zu langsam Spiele- und Multimedia-Programmierung 10
D Highscoreliste eines Applets funktioniert online nicht Spiele- und Multimedia-Programmierung 4
StrikeTom KeyListener Funktioniert nicht Spiele- und Multimedia-Programmierung 3
aze Java 3D 1.5.2 auf Mac(Snow Leopard) funktioniert nicht mit Java SE 1.6 Spiele- und Multimedia-Programmierung 3
K "Animation" funktioniert nur bedingt. Spiele- und Multimedia-Programmierung 8
G Undo/Redo funktioniert nicht richtig Spiele- und Multimedia-Programmierung 2
Kidao Warum funktioniert hier keine Tastaturabfrage? Spiele- und Multimedia-Programmierung 6
R Kollisionserkennung funktioniert nicht Spiele- und Multimedia-Programmierung 3
R KeyListern funktioniert nicht. :S ? Spiele- und Multimedia-Programmierung 7
D Beispielprogram funktioniert nicht Spiele- und Multimedia-Programmierung 8
M Sonnensystem - Eigenrotation der Planeten funktioniert nicht Spiele- und Multimedia-Programmierung 4
M Wie funktioniert der RotPosPathInterpolator? Spiele- und Multimedia-Programmierung 5

Ähnliche Java Themen

Neue Themen


Oben