Recursive Algorithms


Tower of Hanoi

Οι πύργοι του Hanoi είναι ένα μαθηματικό παιχνίδι, το οποίο αποτελείται από τρεις στύλους και έναν αυθαίρετο αριθμό δίσκων διαφορετικού μεγέθους ο καθένας, οι οποίου μπορούν να τοποθετηθούν σε οποιονδήποτε στύλο. Το παιχνίδι ξεκινάει με τους δίσκους να έχουν τοποθετηθεί όλοι σε έναν στύλο, κατά αύξουσα σειρά σε μέγεθος, έτσι ώστε ο μικρότερος να είναι στην κορυφή του κωνικού συνόλου που σχηματίζουν. Ο στόχος του παιχνιδιού είναι να μεταφερθεί ολόκληρος ο σωρός σε οποιονδήποτε άλλο στύλο ακολουθώντας τους παρακάτω απλούς κανόνες:

1. Μόνο ένας δίσκος μπορεί να μετακινηθεί κάθε φορά.

2. Σε κάθε κίνηση επιτρέπεται η μεταφορά του πάνω δίσκου από οποιονδήποτε σωρό και η τοποθέτηση του πάνω από έναν άλλον σωρό (π.χ. ένας δίσκος μπορεί να μετακινηθεί μόνο αν είναι ο πρώτος από πάνω δίσκος ενός σωρού).

3. Κανένας δίσκος δεν μπορεί να τοποθετηθεί πάνω από κάποιον μικρότερο.

Με τρεις δίσκους το παιχνίδι λύνεται σε επτά κινήσεις. Ο ελάχιστος αριθμός κινήσεων που απαιτείται για να επιλυθεί το παζλ είναι , όπου N είναι ο αριθμός των δίσκων.

Pseudocode

1.TowerOfHanoi(n, ‘A’, ‘B’, ‘C’)
2.
if (topN = 1)

3.
move "Disk 1 from " from " to " to

4.
else

5.
TowerOfHanoi(topN - 1, from, to, inter);

6.
move "Disk " topN " from " from " to " to

7.
TowerOfHanoi(topN - 1, inter, from, to);

8.
end if

9.end

Applet

Java applet that demonstrates tower of hanoi algorithm.

Example

Έστω οι πύργοι του Hanoi με n=3 δίσκους. Για να μετακινηθούν 3 δίσκοι από τον στύλο A στον στύλο C πρέπει να μετακινηθούν 2 δίσκοι στον στύλο Β. Έτσι ο δίσκος με τη μεγαλύτερη διάμετρο μένει μόνος του στον στύλο Α και μπορεί να μεταφερθεί στον στύλο C. Το πρόβλημα που μένει να επιλυθεί είναι η μεταφορά 2 δίσκων από τον στύλο Β στον στύλο C. Αναδρομικά μεταφέρονται 2 δίσκοι από τον στύλο Β στον στύλο C. Μετακινείται ο μικρότερος δίσκος από τον στύλο Β στον στύλο Α και έτσι μένει ο μεσαίος δίσκος μόνος του στον στύλο Β και μπορεί να μετακινηθεί στον στύλο C πάνω στον μεγάλο δίσκο. Τέλος ο μικρός δίσκος μεταφέρεται από τον στύλο Α στον στύλο C.