[Java] Hanoi durch exceptions abbrechen lassen

NemesisFS

Lt. Commander
Registriert
Sep. 2008
Beiträge
1.295
Hi,
ich lerne atm exceptions und habe die Aufgabe, per exception die rekursive Funktion für die Türme von Hanoi nach n abläufen abbrechen zu lassen. Ich habe leider keinen Lösungsansatz dafür, kann mir jemand helfen? Die Hanoi Funktion habe ich schon programmiert, sie ist void, das ergebnis wird nur für n = 1 über die Konsole ausgegeben.
Schema:
Scheibe 1 wurde von A nach B bewegt.
 
Einfach die Funktion in einem try catch Block aufrufen. Diese Hanoi-Funktion muss dann, wenn die Abbruchbedingung erfuellt ist, eine Exception werfen mittels throw. Wobei ich mir gerade nicht sicher bin ob dir da die Rekursion etwas im Wege stehen wird.
 
kannst du mir ein beispiel für diese abbruchbedingung posten? habe thow bisher nur in codebeispielen hinter der main funktion gesehnen... "throws IOException"
 
Code:
void hanoi(int n) throws Exception {
  if (n > 0) {
    tue irgendwas
    try {
      hanoi(n-1);
    } catch (Exception e) {
      // tue nix?
    }
 } else
   throw new Exception("sind fertig");
}

Evtl. habe ich es auch falsch verstanden, aber Exception für so etwas zu nutzen ist IMO nicht der Zweck für die Ausnahmebehandlung.
Ergänzung ()

catch kannst du sonst auch außerhalb der Methode machen und dort entsprechend reagieren.
 
ich poste einfach mal den wortlaut der aufgabenstellung, dass die ausnahmebehandlung da missbraucht wird, ist mir auch klar, aber man solls ja erstmal lernen:
Code:
Entwickeln Sie am Beispiel der Türme von Hanoi eine möglichst einfache Erweiterung, die dazu führt, dass nur die ersten K Verscheibeschritte ausgegeben werden, um einen Turm von Scheiben der Höhe  N vom Startturm A mit dem Hilfsturm B zum Zielturm C zu bewegen.
Ihre Lösung soll nach K Verschiebeschritten eine Ausnahme mit der Meldung "hier abgebrochen" werfen, die in der main Methode gefangen und ausgegeben wird.
z.B. wäre für N=4 und K=5 der Aufruf folgender

> java HanoiNK 4 5

und die gewünschte Ausgabe folgende:

Setze Scheibe 1 von A nach B
Setze Scheibe 2 von A nach C
Setze Scheibe 1 von B nach C
Setze Scheibe 3 von A nach B
Setze Scheibe 1 von C nach A
java.lang.Exception: hier abgebrochen
 
Einfach der Hanoi je nach implementierung 1-2 zusätzliche Variablen übergeben.
Die Erste ist K (kann auch als classvariable verwendet werden).
Die Zweite ist eine Variable die du jeden method call incrementierst und einfach immer schaust das es kleiner(gleich) K ist.
Falls Bedienung entsprechend erfüllt ist break.
 
Ich habe das Programm nun geschrieben, leider kriege ich keinen Laufzeitfehler... In der Konsole kann ich ihn nicht sehen und eclipse gibt irgendwelche timeouts oder so an...

Hier der Code: (Fehlerbehoben)
Code:
public class HanoiNK {
	static int zug;
	public static void main(String [] args) {
		try {
			hanoi(Integer.parseInt(args[0]), Integer.parseInt(args[1]));
		}
		catch(Exception e) {
			System.out.println(e);
		}
	}

	static void hanoi(int n, int k) throws Exception {
		zug = k;
		hanoi(n, 'A', 'B', 'C');
	}

	static void hanoi(int n, char vonstapel, char nachstapel, char lager) throws Exception {
		n--;
		if(n > 1) hanoi(n, vonstapel, lager, nachstapel);
		zug--;
		System.out.println("Zug " + zug + ": Bewege Scheibe " + n + " von " + vonstapel + " nach " + nachstapel + ".");
		if(n > 1) hanoi(n, lager, nachstapel, vonstapel);
	}
}
Ergänzung ()

Frohes Neues Jahr zusammen!

habe das Problem inzwischen, trotz Sekt gefunden:
statt die beiden Funktionen mit n-- aufzurufen, habe ich vor den Aufrufen einfach n-- ausgeführt, jetzt gehts. Die Exception tuts auch, allerdings habe ich das Problem, dass ich nicht weiß, wie ich diese (von der Aufgabe geforderte) Ausgabe erhalte:
"java.lang.Exception: hier abgebrochen" Ich könnte das ganze zwar per String übergeben, aber ich denke nicht, dass das gewünscht ist...

Edit: Problem gelöst, Code aktualisiert...
 
Zuletzt bearbeitet:
Hey,
ist die obige Lösung deine Endlösung? Bekomme da leider keine Exception.
Kannst du ggf. die endgültige Fassung nocheinmal posten?

Vielen Dank, Phil
 
Hmm..ist die Bedeutung von Exceptions in Java anders im Vergleich zum .NET?
Warum wird nicht einfach ein Event ausgelöst, auf welchen dann reagiert wird?
 
vielen Dank für den Tipp,
habe es jetzt durch hinzufügen von "throw new exception" wenn Bedingung erfüllt, gelöst.
 
Zurück
Oben