Wieże Hanoi
Z Wikipedii
Wieże Hanoi – problem polegający na odbudowaniu, z zachowaniem kształtu, wieży z krążków o różnych średnicach (popularna dziecięca zabawka), przy czym podczas przekładania wolno się posługiwać buforem, reprezentowanym w tym przypadku przez dodatkowy słupek, jednak przy ogólnym założeniu, że nie można kłaść krążka o większej średnicy na mniejszy ani przekładać kilku krążków jednocześnie. Jest to przykład zadania, którego złożoność obliczeniowa wzrasta niezwykle szybko w miarę zwiększania parametru wejściowego, tj. liczby elementów wieży.
Spis treści |
[edytuj] Pochodzenie
Zagadka Wież Hanoi stała się znana w XIX wieku dzięki matematykowi Édouard Lucasowi, który proponował zagadkę dla 8 krążków. Do sprzedawanego zestawu była dołączona (prawdopodobnie wymyślona przez Lucasa) tybetańska legenda, według której mnisi w świątyni Brahmy rozwiązują tę łamigłówkę dla 64 złotych krążków. Legenda mówi, że gdy mnisi zakończą zadanie, nastąpi koniec świata. Zakładając, że wykonują 1 ruch na sekundę, ułożenie wieży zajmie 264−1 = 18 446 744 073 709 551 615 (blisko 18 i pół tryliona) sekund, czyli około 584 542 miliardów lat. Dla porównania: Wszechświat ma około 13 700 mld lat.
[edytuj] Algorytm
Wieże Hanoi można łatwo rozwiązać za pomocą prostego algorytmu rekurencyjnego lub iteracyjnego.
- nazywamy słupki: A, B, C
- niech n będzie liczbą krążków, które chcemy przenieść ze słupka A na słupek B posługując się słupkiem C jako buforem
[edytuj] Rozwiązanie rekurencyjne
Algorytm rekurencyjny składa się z następujących kroków:
- (rekurencyjnie) przenieś n-1 krążków ze słupka A na słupek C posługując się słupkiem B
- przenieś jeden krążek ze słupka A na słupek B
- (rekurencyjnie) przenieś n-1 krążków ze słupka C na słupek B posługując się słupkiem A
przykładowa implementacja w Pythonie:
def hanoi(n,A,B,C):
"""słupki A,B,C są listami"""
if n > 0:
hanoi(n-1,A,C,B) # rekurencyjnie przekładamy n-1 krążków z A na C
B.insert(0,A.pop(0)) # przekładamy jeden krążek z A na B
hanoi(n-1,C,B,A) # rekurencyjnie przekładamy n-1 krążków z C na B
W nauczaniu informatyki algorytm rozwiązywania wież Hanoi jest często pierwszym przykładem algorytmu rekurencyjnego.
[edytuj] Rozwiązanie iteracyjne
Algorytm iteracyjny składa się z następujących kroków:
- przenieś najmniejszy krążek na kolejny (*) słupek.
- wykonaj jedyny możliwy do wykonania ruch, nie zmieniając położenia krążka najmniejszego
- powtarzaj punkty 1 i 2, aż do odpowiedniego ułożenia wszystkich krążków.
(*) Kolejny słupek wyznaczamy w zależności od ilości krążków. Jeśli ilość krążków jest parzysta, kolejnym słupkiem jest ten po prawej stronie (gdy dojdziemy do słupka C w następnym ruchu używamy słupka A). Natomiast jeśli ilość krążków jest nieparzysta, kolejnym słupkiem jest ten po lewej stronie (gdy dojdziemy do słupka A w następnym ruchu używamy słupka C)
[edytuj] Równanie na ilość ruchów
Równanie określające ilość ruchów potrzebnych do rozwiązania problemu wież Hanoi dla n krążków:
[edytuj] Dowód
Łatwo pokazać, że
:
- w pierwszym kroku przekładamy n-1 krążków na jeden słupek (BSO załóżmy, że jest to krążek nr 3) - wymaga to co najmniej L(n-1) ruchów
- przekładamy n-ty krążek na drugi słupek - wymaga to jednego ruchu
- przekładamy pozostałe krażki ze słupka 3. na n-ty krążek leżący na 2. słupku - wymaga to co najmniej L(n-1) ruchów
a więc
.
Aby wykazać, że
można przeprowadzić następujące rozumowanie:
Aby móc ruszyć n-ty krążek, trzeba najpierw zdjąć wszystkie leżące na nim krążki, tak by po ich zdjęciu jeden z słupków pozostał wolny (aby na jego "dno" mógł trafić n-ty krążek). A więc ze słupka 1 przekładamy krążki
na słupek 3. Ponieważ aż do momentu gdy na drążku 1 pozostanie tylko n-ty krążek nie ma znaczenia czy rzeczywiście się on tam znajduje, a więc do tego momentu sytuacja upraszcza się do rozwiązania problemu wież Hanoi dla n-1 krążków (którego minimalna ilość ruchów wynosi L(n-1)). Na przełożenie krążka n-tego potrzeba co najmniej jeden ruch. Po jego przełożeniu znów potrzeba przełożyć krążki
- jest to oczywiście znów sytuacja n-1 krążków (wymagająca co najmniej L(n-1) ruchów).
A więc 
co w połączeniu z górnym ograniczeniem na L(n) daje równość
[edytuj] Postać jawna wzoru na liczbę ruchów
Powyższe równanie rekurencyjne można w łatwy sposób przekształcić do postaci jawnej, tj. nie korzystającej z rekursji:
Niech 
Wtedy
jest to równanie określające ciąg geometryczny o ilorazie równym 2 takie, że
Po powrocie do L(n) otrzymujemy
[edytuj] Zastosowanie
Mimo swojego wieku łamigłówka jest stale tematem prac matematyków i znane są jej bardziej rozbudowane wersje np. z więcej niż trzema słupkami.
W psychologii łamigłówka ta jest jednym z testów na kojarzenie.
[edytuj] Zobacz też
| Wyjazdowe obrady klubu PO: wraca sprawa Staroń |
Podczas wyjazdowego posiedzenia klubu PO w miejscowości Ossa k. Rawy Mazowieckiej Lidia Staroń czyniła wyrzuty kolegom, że nie wsparli jej po publikacji "Rzeczpospolitej". Gazeta napisała, że Staroń zarobiła kilkaset tysięcy zł, bo ustawa, nad którą pracowała, pozwoliła jej uwłaszczyć lokal usługowy. Donald Tusk - relacjonuje zastrzegający anonimowość uczestnik obrad - poparł Staroń, natomiast Zbigniew Chlebowski nie zabrał głosu. |
| Pierwsza ofiara mrozu. Mężczyzna znaleziony na Podkarpaciu |
45-letni mężczyzna jest najprawdopodobniej pierwszą tegoroczną ofiarą mrozów na Podkarpaciu. Policjanci wyjaśniają dokładne przyczyny śmierci mieszkańca Trzebuski. Mężczyznę znaleziono niespełna sto metrów od jego domu. Wiele wskazuje na to, że zmarł w wyniku wychłodzenia organizmu. |
| Pacelt do dymisji, dostanie nowe zadania |
Ostrowiecki poseł Platformy Obywatelskiej Zbigniew Pacelt zostanie odwołany ze stanowiska wiceministra sportu. Teraz będzie odpowiadał za przygotowania reprezentacji Polski do igrzysk w Londynie. |
| Osiedlowy zespół ukradł sprzęt Acid Drinkers |
Policjanci odzyskali sprzęt muzyczny należący do zespołu Acid Drinkers. Złodziejami okazali się 17-letni Jakub K. i 18-letni Paweł K., członkowie osiedlowego zespołu z Ełku. Za kradzież odpowiedzą przed sądem. Grozi im nawet pięć lat więzienia. |
| Pijany policjant spowodował kolizję |
26-letni pijany policjant spowodował w sobotę w Elblągu kolizję. Funkcjonariusz, który miał w wydychanym powietrzu 2,5 promila alkoholu, straci pracę. Czeka go także sprawa karna - poinformowała Justyna Grzeczka z elbląskiej policji. |
| Drugie podejście PO do ustawy o mediach |
PO wraca do rozmów z lewicą o zmianach w mediach. W przyszłym tygodniu politycy Platformy maja wyłożyć na stół nowy projekt ustawy medialnej - dowiedział się "Dziennik". |
| PiS zaniepokojone sprawą posłów Sejmu Litwy z Kartą Polaka |
PiS jest zaniepokojone sprawą posłów litewskiego Sejmu posiadających Kartę Polaka. Dwóm z trzech posłów AWPL grozi utrata mandatu litewskiego posła z powodu przyjęcia przez nich Karty, co budzi na Litwie kontrowersje. |
| Ojciec, gdy wypił, znęcał się nad córką |
Ojciec nadużywał alkoholu. Gdy był pijany, bił córkę drewnianą listewką. Dziewczynka opowiedziała o tym opiekunce ze świetlicy osiedlowej. Ta o sprawie zawiadomiła policję. 47-letniego Arkadiusza L. zatrzymano. Miał prawie promil alkoholu we krwi. Został aresztowany na trzy miesiące. |
| Kaczyński: Pokażemy inne przypadki pijanych posłów w Sejmie |
- PiS nie będzie podejmował żadnych decyzji w sprawie Elżbiety Kruk - powiedział Jarosław Kaczyński. Posłanka w czasie wczorajszych porannych głosowań w Sejmie chwiała się na nogach i niewyraźnie mówiła. |
| Zawieje i zamiecie na południu, dużo śniegu na północy |
Zawieje i zamiecie śnieżne mogą nękać aż do jutrzejszego popołudnia całe południe Polski. na północy, nad Bałtykiem pada i ma padać śnieg. Jak zapowiada Instytut Meteorologii i Gospodarki Wodnej w ciągu doby może tam spaść nawet 20 centymetrów śniegu. |










