Przeczytaj
Implementacja rozwiązania w języku Python
Liczba ruchów niezbędnych do przeniesienia wszystkich krążków ze słupka A na słupek C wynosi , czyli rośnie wykładniczo wraz ze zwiększaniem liczby krążków. Jeśli przyjmiemy, że jeden krążek przemieszczamy w ciągu jednej sekundy, to rozwiązanie łamigłówki dla trzech krążków zajmuje tylko siedem sekund, podczas gdy w przypadku krążków czas ten wydłuża się już do sekund (ponad minut, czyli około dni).
Jeden z najszybszych współczesnych komputerów, MareNostrum , wykonuje operacji na sekundę. By rozwiązać zagadkę dla krążków potrzebowałby nieco ponad dwóch tygodni.
Zdefiniujmy funkcję, która wykorzystując podany wcześniej algorytm, zapisze listę ruchów koniecznych do rozwiązania łamigłówki Wież Hanoi.
Wywołajmy funkcję dla trzech krążków. Otrzymamy listę ruchów potrzebnych do przeniesienia krążków ze słupka A na słupek C przy użyciu słupka B.
Po podwojeniu liczby krążków lista operacji wydłuża się dziewięciokrotnie. Krążków jest sześć, należy zatem wykonać ruchy .
Możemy sprawdzić, ile razy wykonywana jest funkcja rekurencyjna, czyli taka, która wywołuje wielokrotnie siebie samą. W celu sprawdzenia liczby wykonywanych przez nią operacji posłużymy się zmienną, która istnieje w przestrzeni nazwprzestrzeni nazw poza funkcją. Aby zmieniać jej wartość, zadeklarujmy ją za pomocą słowa kluczowego global
. Dzięki temu będziemy mogli zmieniać wartość zmiennej, która istnieje poza funkcją.
Zdefiniujmy funkcję, która obliczy liczbę wywołań funkcji, niezbędnych dla rozwiązania zagadki Wież Hanoi. Przyjmijmy założenie, że jedno wywołanie trwa 1 sekundę.
W celu zobrazowania wyników obliczeń posłużymy się biblioteką matplotlibmatplotlib i napiszemy program wyświetlający wykres zależności liczby kroków od liczby krążków. Przyjmiemy, że przeniesienie krążka trwa sekundę. Wyniki podamy w dobach, a więc na wykresie jednostka osi Y
będzie odpowiadać sekund (przenosin krążków).
Musimy pamiętać, że język Python jest dynamicznie typowany, a więc każda zmienna może w dowolnym momencie przechowywać dane różnego typu. Dodatkowo jest to interpreter, a nie kompilator. Z tych powodów nawet proste obliczenia zajmują dużo czasu procesora, dlatego odradzamy liczenie w taki sposób dla więcej niż krążków. Na komputerze wyposażonym w procesor Core i obliczenia dla i więcej krążków trwają kilka godzin.
Zadanie:
Zapisz program wykorzystujący rekurencję, który wypisze kolejne kroki, jakie trzeba wykonać, aby przenieść wieżę składającą się z n
krążków o różnej średnicy ze słupka A
na słupek C
. Swój program przetestuj dla 3 krążków.
Zasady gry:
Gra składa się z trzech słupków i zestawu krążków o różnych średnicach.
Na jednym słupku umieszczona jest wybudowana wieża.
Celem gry jest odbudowanie wieży na trzecim słupku.
Nie wolno położyć krążka o większej średnicy na krążku o mniejszej średnicy.
Na raz można przenosić tylko jeden krążek (znajdujący się na szczycie wieży).
Do przenoszenia można wykorzystać dodatkowy słupek.
Specyfikacja:
Dane:
n
– liczba krążków w grze, liczba naturalnaA, B, C
– symboliczne nazwy słupków, znaki
Wynik:
Program na wyjściu standardowym wypisuje w kolejnych linijkach kroki, które prowadzą do rozwiązania zagadki Wież Hanoi.
Porównaj swoje rozwiązanie z przedstawionym w filmie.
Podsumujmy najważniejsze informacje:
liczba operacji niezbędnych do rozwiązania zagadki Wież Hanoi rośnie wykładniczo wraz ze wzrostem liczby krążków składających się na wieżę,
operacje przenoszenia krążków składających się na Wieże Hanoi przypominają sposób odwoływania się procesora do elementów stosu.
Słownik
funkcja, która wywołuje samą siebie, aż do momentu osiągnięcia stanu początkowego – każda taka funkcja zawiera tzw. warunek zakończenia rekurencji (zwany także warunkiem początkowym) oraz przynajmniej jedno miejsce, w którym procedura wywołuje samą siebie
biblioteka służąca do przedstawienia obrazów złożonych z punktów o współrzędnych (x
, y
), np. wykresów, histogramów, rozkładów itp.; moduł matplotlib
nie jest dostępny w standardowej instalacji języka Python - można go zainstalować, korzystając z mechanizmu pip
warunek w funkcji rekurencyjnej, po spełnieniu którego funkcja ponownie wywołuje siebie samą
warunek w funkcji rekurencyjnej, po spełnieniu którego funkcja nie wywołuje samej siebie po raz kolejny
proces polegający na wywoływaniu funkcji przez siebie samą do momentu rozwiązania określonego zadania
struktura danych, w której informacje są pobierane ze szczytu i na niego odkładane; struktura typu LIFO (Last In, First Out – ostatni na wejściu, pierwszy na wyjściu)
łamigłówka polegająca na odbudowaniu, z zachowaniem kształtu, wieży z krążków o różnych średnicach; podczas przekładania nie wolno kłaść krążka o większej średnicy na mniejszy, ani przekładać kilku krążków jednocześnie