Turm von Hanoi - Iterativ

bvdcomp

Aktives Mitglied
Hallo zusammen

Ich habe folgende Aufgabe:
1) Erstelle ein Programm welches den Turm von Hanoi wiedergibt.
2) Verwende dazu die Schnittstelle java.util.Iterator

zu 1)
Hier habe folgendes gemacht (Es funktioniert):
Java:
public class Hanoi {	
 	static void hanoiIter(int n)
 	{
 		int [][] bars = new int [3][n+1];
 		int [] lastPos = {n,0,0};
 		int posDisc = 0;
 		for(int i = 0; i<n+1; ++i) {
 			bars[0][i] = n+1-i;
 		}
 		bars[1][0] = n+1;
 		bars[2][0] = n+1;
 		
 		while(bars[2][n]!=1){
 			System.out.printf("Kleinster Ring von %d nach %d\n\n",posDisc, (posDisc+1)%3);
 			bars[posDisc][lastPos[posDisc]--] = 0;
 			posDisc = (posDisc +1)%3;
 			bars[posDisc][++lastPos[posDisc]] = 1;
 			
 			int pos1 = (posDisc+1)%3;
 			int pos2 = (posDisc+2)%3;
 			
 			if(bars[pos1][lastPos[pos1]] > bars [pos2][lastPos[pos2]]){
 				System.out.printf("---> Ring von %d nach %d\n", pos2, pos1);
 				bars[pos1][++lastPos[pos1]] = bars[pos2][lastPos[pos2]];
 				bars[pos2][lastPos[pos2]--] = 0;
 			}else if (bars[pos1][lastPos[pos1]] < bars [pos2][lastPos[pos2]]){
 				System.out.printf("---> Ring von %d nach %d\n", pos1, pos2);
 				bars[pos2][++lastPos[pos2]] = bars[pos1][lastPos[pos1]];
 				bars[pos1][lastPos[pos1]--] = 0;
 			}
 		}
 		
 			
 	}
	public static void main(String[] args) {

		System.out.println("hanoi(3)");
		hanoiIter(4);
	}
}
------------------------------

2) Dieses Technologie soll dazu verwendet werden:
Java:
import java.util.Iterator;

public class ListeIterator<E> extends Liste<E> {
	/**
	 * erzeugt Iteratorobjekt, mit dem die Liste durchlaufen werden kann
	 * @return
	 */
	public Iterator<E> iterator() {
		return new Iterator<E>() { // anonyme Implementierung der Schnittstelle
			private Knoten<E> k = aelteste;
			public boolean hasNext() { return k != null; }
			public E next() { Knoten<E> l = k; k = k.verbindung; return l.wert; }
			public void remove() {} // leere Implementierung, da nicht benötigt
		};
	}
	/**
	 * vergleicht zwei Liste-Objekte auf den gleichen Inhalt mit Hilfe des Iterators
	 * @param that wird mit this verglichen
	 * @return true wenn die beiden Listen denselben Inhalt haben
	 */
	public boolean istGleichIt(final ListeIterator<E> that) {
		Iterator<E> dieser = this.iterator(), jener = that.iterator();
		while (dieser.hasNext() && jener.hasNext())
			if (dieser.next() != jener.next())
				return false;
		return dieser.hasNext() == jener.hasNext();
	}
	/**
	 * kopiert den Inhalt des Parameterobjekts mit Hilfe des Iterators
	 * @param that ist die Quelle, this is das Ziel des Kopiervorgangs
	 */
	public void kopierenIt(final ListeIterator<E> that) {
		Iterator<E> jener = that.iterator();
		aelteste = juengste = null; // this.entleeren();
		while (jener.hasNext())
			eintragen(jener.next());
	}	

	/**
	 * Testtreiber
	 * @param args wird nicht benutzt
	 */
	public static void main(String[] args) {
		try {
			ListeIterator<Integer> s = new ListeIterator<Integer>();
			System.out.println("Liste als Liste");
			s.eintragen(new Integer(1));
			s.eintragen(new Integer(2));
			s.eintragen(new Integer(3));
			s.eintragen(new Integer(4));
			s.eintragen(new Integer(5));
			System.out.println("Liste hat 5 Elemente");
			ListeIterator<Integer> t = new ListeIterator<Integer>();

			System.out.println("Kopieren & Vergleichen mit Iterator");
			t.kopierenIt(s);
			if (t.istGleichIt(s))
				System.out.println("Zwei Listen gleich");
			else 
				System.out.println("Fehler: Zwei Listen ungleich");

		} catch (Exception e) {
			System.out.println("LeerAusnahme");
		}			
	}
}

Kann mir jemand hier sagen wo ich anfangen soll? Es wäre gut wenn ich eine Step by step erklärung hätte, damit ich wirklich verstehe was hier passiert.

Danke für eure Hilfe.
 
S

SlaterB

Gast
ListeIterator hat in einem solchen Programm keine sinnvolle Funktion,
jedenfalls meiner bescheidenen Meinung nach

am ehesten könnte man noch den Anfangs- und Endzustand des bars-Array in einer Liste abbilden und diese dann vergleichen,
um zu bestätigen, dass der Anfangszustand wieder erreicht ist,
aber da kann man genauso die Arrays vergleichen oder eine String-Repräsentation zusammenbauen

für das Verfahren an sich brauchst du ein zweidimensionales Array oder eine ähnliche Struktur, hast du ja auch,
eine einfache Liste kann dabei nicht helfen,
auch mit drei ListeIterator für die drei Bars bist du nicht unbedingt besser dran, die Methoden kopierenIt/ istGleichIt werden dir nichts nützen,
je nach Funktionalität der Oberklasse Liste<E> könnte es noch funktionieren (eintragen dürfte vorhanden sein, auch size/ löschen nötig),
gegenüber einem Array hast du aber kaum gewonnen, du sparst vielleicht das separate Array lastPos

aus Logik-Sicht hat diese zweite Anforderung keinen Sinn
 

bvdcomp

Aktives Mitglied
Hallo zusammen,

Es ist richtig das ich das nicht selbst erfunden habe, sondern eben umgesetzt und funkt. Ich verstehe auch das Prinzip.

Womin ich probleme habe ist mit der class ListeIterator. Ich kann die "Übersetzung" nicht machen..

Kann mir jemand da helfen?
 
S

SlaterB

Gast
helfen == du machst nichts außer die Aufgabe zu posten + andere Quellen zu kopieren, dabei auch ohne Quellenangabe mit Täuschungsversuch es wäre deine Arbeit, Guttenberg läßt grüßen, und andere sollen den Rest ergänzen?
na das wird schwierig..

> Ich kann die "Übersetzung" nicht machen..
genau das ist das was 'ich verstehe das Prinzip' eben NICHT bedeutet,
du kannst ja auch erstmal einfach nur das Programm auf 'ohne Arrays' umschreiben, nur mit (beliebigen) Listen oder sonstigen Datenstrukturen,
wenn du auch nur ungefähr weißt was ein Array und was eine Liste ist, dann sollte diese Teilaufgabe nicht schwer sein und zeigt, dass du auch selber mitarbeitest
 
Zuletzt bearbeitet von einem Moderator:

bvdcomp

Aktives Mitglied
helfen == du machst nichts außer die Aufgabe zu posten + andere Quellen zu kopieren, dabei auch ohne Quellenangabe mit Täuschungsversuch es wäre deine Arbeit, Guttenberg läßt grüßen, und andere sollen den Rest ergänzen?
na das wird schwierig..

> Ich kann die "Übersetzung" nicht machen..
genau das ist das was 'ich verstehe das Prinzip' eben NICHT bedeutet,
du kannst ja auch erstmal einfach nur das Programm auf 'ohne Arrays' umschreiben, nur mit (beliebigen) Listen oder sonstigen Datenstrukturen,
wenn du auch nur ungefähr weißt was ein Array und was eine Liste ist, dann sollte diese Teilaufgabe nicht schwer sein und zeigt, dass du auch selber mitarbeitest

Das stimmt überhaupt nicht, ich habe ja gschrieben, das ich step by step es verstehen will und ich schreibe auch keine Doktorarbeit.
Die Version mit Arrays habe ich verstanden, aber ich kann es mit Interator nicht umsetzten, ich möchte keine fertige lösung sondern, einen schuppser und wenn ich nicht weiterkomme sollte man mir da weiterhelfen.
 
S

SlaterB

Gast
ein Schubser ist, es eben nicht mit einem Iterator umzusetzen sondern mit einer ganz normalen Liste,
set() und get() statt Array-Zugriffe, size() statt des lastPos-Arrays, dass ist teils 1:1 umzubauen,

wie in meiner ersten antwort geschrieben kann der Iterator da quasi nicht mehr helfen als unter normaler Listen-Verwendung,
wobei ich natürlich das vielleicht auch nur nicht sehe, wenn es wer anders weiß, kommt vielleicht noch ein besserer Hinweis
 

Marco13

Top Contributor
Ohne, dass das jetzt zuuu sehr systematisch wirken soll: Noch ein Link.

Ich gehe im Moment davon aus, dass du eine Aufgabe hattest wie "Erstellen sie einen Iterator, der die Lösungsschritte der Türme von Hanoi ausgibt", vielleicht noch mit ein bißchen Ausschmückung wie "Das soll so sein wie bei List#iterator()" oder so, und du dann die beiden Codeschnipsel aus dem ersten Post im Netz gefunden hast, und jetzt erwartest (oder zumindest erhoffst), dass sie jemand zu etwas verschmilzt, was du dann abgeben kanns. Zu sagen "Ich verstehe auch das Prinzip." ist ... (*zurückhalt*) ... ... ... ... "Das mit der Relativitätstheorie hätte ICH genauso gemacht..." ;)
Hm. Vielleicht kommt ja noch was.
 

Neue Themen


Oben