Przeczytaj
Popularyzatorem łamigłówki znanej jako Wieże Hanoi jest francuski matematyk Édouard Lucas. Zajmował się on m.in. badaniem właściwości ciągu Fibonacciego (podał wzór na jego n‑ty wyraz) i opracował własną metodę sprawdzania, czy liczba naturalna jest liczbą pierwszą. Ideę Wież Hanoi Lucas przedstawił w 1883 roku.
Na czym polega zagadka Wież Hanoi?
Zagadka Wież Hanoi polega na przeniesieniu n krążków z jednego słupka na drugi. Musi jednak zostać spełnionych kilka warunków:
krążki muszą mieć różne średnice,
wszystkie krążki początkowo są nałożone na jeden ze słupków,
krążki są ułożone w kolejności od krążka o największej średnicy (na dole słupka) do krążka o najmniejszej średnicy (na górze słupka),
jednorazowo możemy przenieść tylko jeden krążek,
nie można położyć większego krążka na mniejszym,
mamy do dyspozycji dodatkowy, pomocniczy słupek, na który możemy tymczasowo nakładać krążki.
Gdy wszystkie krążki znajdą się na docelowym słupku, uznajemy problem za rozwiązany. Poniżej został zobrazowany stan początkowy – wszystkie krążki znajdują się na słupku A, a następnie stan końcowy – wszystkie krążki znajdują się na słupku C. Pomocniczym słupkiem jest słupek B.
Rozwiązanie iteracyjne
Zastanówmy się, w jaki sposób rozwiązać zagadkę Wież Hanoi iteracyjnieiteracyjnie.
Aby rozwiązać problem, krążki musimy przekładać na zmianę. Pierwszym krokiem jest przeniesienie najmniejszego krążka ze słupka, na którym jest nałożony, na kolejny słupek. Kolejny słupek wyznaczamy w następujący sposób:
Jeżeli liczba krążków jest parzysta, kolejnym słupkiem jest słupek po prawej stronie, czyli ze słupka A przenosimy na słupek B, ze słupka C na słupek A.
Jeżeli liczba krążków jest nieparzysta, kolejnym słupkiem jest ten po lewej stronie, czyli ze słupka A przenosimy na słupek C itd.
Drugi krok polega na tym, że innym krążkiem wykonamy jedyny dostępny ruch, to znaczy taki, w którym nie położymy większego krążka na mniejszy.
Dwa powyższe kroki powtarzamy tak długo, aż wszystkie krążki znajdą się na słupku C.
Kolejne etapy rozwiązania zagadki Wież Hanoi dla trzech krążków zostały przedstawione poniżej. Na czerwono zostały oznaczone krążki, które będziemy przenosić, natomiast na fioletowo krążki, które zostały właśnie przeniesione.
Jak widać na powyższym obrazku, wykonaliśmy siedem ruchów w celu przeniesienia trzech krążków.
Buddyjska legenda a informatyka
Dlaczego na lekcji informatyki w ogóle zajmujemy się układanką pochodzącą z czasów, gdy nie istniały jeszcze komputery? Otóż Wieże Hanoi zbudowane są podobnie do struktury danych zwanej stosemstosem, wykorzystywanej przez procesory podczas przetwarzania informacji.
Tak jak w przypadku krążków składających się na wieżę, w stosie dostępny jest tylko element znajdujący się na samym jego szczycie. Jedyną różnicą jest to, że elementy stosu mają postać ciągów zer i jedynek, a nie krążków. Procesory albo odkładają dane na szczyt stosu, albo pobierają ze stosu odłożone tam elementy.
Rozwiązanie rekurencyjne
Zapisany za pomocą pseudokodu algorytm wykorzystujący rekurencjęrekurencję wygląda w następujący sposób:
Rekurencyjne rozwiązanie zagadki Wież Hanoi zawarte jest w trzech krokach:
W trzeciej linii pseudokodu wywołujemy rekurencyjnie funkcję
wiezaHanoi
. Ta wywołana rekurencyjnie funkcja zrealizuje nam przeniesienien - 1
górnych krążków ze słupka A na słupek B. Na słupku A pozostanien
-ty, największy krążek. Reszta krążków będzie nałożona na słupku B.W czwartej linii przenosimy
n
-ty krążek ze słupka A na słupek docelowy C.W piątej linii ponownie wywołujemy rekurencyjnie funkcję
wiezaHanoi
, aby przenieśćn - 1
krążków ze słupka B na słupek C, na którym położony jest już największy krążek.
Ilustracja przedstawia kroki algorytmu rekurencyjnego dla sześciu krążków.
Złożoność obliczeniowa
Liczba przeniesień pojedynczego krążka, które należy wykonać, aby rozwiązać zagadkę Wież Hanoi wynosi:
Na przykład dla trzech krążków liczba przeniesień wynosi:
Zatem złożoność obliczeniowa algorytmu rozwiązania problemu Wież Hanoi to:
Jest to złożoność wykładniczazłożoność wykładnicza, to znaczy rośnie bardzo szybko wraz ze wzrostem liczby krążków, czyli parametru wejściowego.
Słownik
funkcja, która wywołuje samą siebie aż do momentu osiągnięcia przypadku bazowego
słowo pochodzące od łacińskiego iteratio (powtarzanie); oznacza powtarzanie w pętli tych samych instrukcji, aż do spełnienia pewnego warunku
myślenie, które polega na tym, że wartość pewnej wielkości obliczana jest poprzez odwołanie się do wielkości określonych dla mniejszych wartości parametrów
warunek w funkcji rekurencyjnej, po spełnieniu którego funkcja nie wywołuje samej siebie po raz kolejny
warunek w funkcji rekurencyjnej, po spełnieniu którego funkcja ponownie wywołuje siebie samą
sytuacja, w której funkcja wywołuje samą siebie aż do napotkania przypadku podstawowego
struktura danych, w której informacje pobierane są z wierzchołka i odkładane na wierzchołek; struktura typu LIFO (Last In, First Out – ostatni na wejściu, pierwszy na wyjściu)
problem, polegający na przeniesieniu wieży z krążków z jednego słupka na drugi, przy czym można przenosić tylko po jednym krążku z wierzchu stosu; nie jest dozwolone położenie większego krążka na mniejszym
złożoność, która jest określona za pomocą funkcji wykładniczej, rośnie w zależności od rozmiaru danych wejściowych