Problem wież Hanoi

1. Czym jest problem wież Hanoi?

Wieże Hanoi to klasyczna łamigłówka matematyczna wymyślona w 1883 roku przez francuskiego matematyka Édouarda Lucasa.

Zasady:

  1. Mamy 3 paliki (A, B, C)
  2. Na paliku A jest n krążków różnej wielkości (od największego na dole do najmniejszego na górze)
  3. Cel: Przenieść wszystkie krążki z A na C
  4. Reguły:
  5. Można przenosić tylko 1 krążek na raz
  6. Można brać tylko górny krążek z palika
  7. Większy krążek NIE MOŻE leżeć na mniejszym

Wizualizacja (3 krążki):

Stan początkowy:
    A         B         C
   |||        |         |
  |||||       |         |
 |||||||      |         |
---------  ---------  ---------

Cel:
    A         B         C
    |         |        |||
    |         |       |||||
    |         |      |||||||
---------  ---------  ---------

2. Rozwiązanie rekurencyjne

Kluczowa obserwacja:

Aby przenieść n krążków z A na C (używając B):

  1. Przenieś (n-1) krążków z A na B (używając C)
  2. Przenieś największy krążek z A na C
  3. Przenieś (n-1) krążków z B na C (używając A)

2.1. Implementacja

Wynik:

Przenieś krążek z A na C
Przenieś krążek z A na B
Przenieś krążek z C na B
Przenieś krążek z A na C
Przenieś krążek z B na A
Przenieś krążek z B na C
Przenieś krążek z A na C

7 ruchów dla 3 krążków!


3. Wizualizacja kroków (n=3)

Stan początkowy:
    A         B         C
   |||        |         |
  |||||       |         |
 |||||||      |         |

Ruch 1: A → C
    A         B         C
    |         |        |||
  |||||       |         |
 |||||||      |         |

Ruch 2: A → B
    A         B         C
    |        |||       |||
    |         |         |
 |||||||      |         |

Ruch 3: C → B
    A         B         C
    |        |||        |
    |       |||||       |
 |||||||      |         |

Ruch 4: A → C
    A         B         C
    |        |||        |
    |       |||||       |
    |         |      |||||||

Ruch 5: B → A
    A         B         C
   |||        |         |
    |       |||||       |
    |         |      |||||||

Ruch 6: B → C
    A         B         C
   |||        |        |||||
    |         |         |
    |         |      |||||||

Ruch 7: A → C (KONIEC!)
    A         B         C
    |         |        |||
    |         |       |||||
    |         |      |||||||

4. Liczba ruchów

Wzór:

Minimalna liczba ruchów = 2^n - 1
n (krążków) Ruchy Czas (1 ruch/s)
1 1 1 sekunda
2 3 3 sekundy
3 7 7 sekund
4 15 15 sekund
5 31 31 sekund
10 1,023 ~17 minut
20 1,048,575 ~12 dni
64 2^64 - 1 ~585 mld lat

Dowód (indukcja):

Niech T(n) = liczba ruchów dla n krążków

T(1) = 1  (przypadek bazowy)

T(n) = T(n-1) + 1 + T(n-1)
     = 2×T(n-1) + 1

T(2) = 2×T(1) + 1 = 2×1 + 1 = 3
T(3) = 2×T(2) + 1 = 2×3 + 1 = 7
T(4) = 2×T(3) + 1 = 2×7 + 1 = 15

Ogólnie: T(n) = 2^n - 1

5. Implementacja z licznikiem


6. Implementacja ze stosami


7. Analiza złożoności

Złożoność czasowa: O(2^n)

Wynik:

n=1: 1 wywołań, 1 ruchów
n=2: 3 wywołań, 3 ruchów
n=3: 7 wywołań, 7 ruchów
n=4: 15 wywołań, 15 ruchów
n=5: 31 wywołań, 31 ruchów
...

Liczba wywołań = liczba ruchów = 2^n - 1

Złożoność pamięciowa: O(n)

Głębokość rekurencji = n (stos wywołań)


8. Wariant iteracyjny (bez rekurencji)

Możliwe, ale znacznie bardziej skomplikowane:

Wniosek: Rekurencja jest znacznie prostsza!


9. Warianty problemu

9.1. Wieże Hanoi z 4 palikami (Reve's puzzle)

Minimalna liczba ruchów: nie ma prostej formuły!

9.2. Ograniczenia na ruchy

Niektóre warianty zabraniają ruchów między konkretnymi palikami (np. A → C bezpośrednio).


10. Zastosowania praktyczne

10.1. Backup rotacyjny

Trzy poziomy backupów (dzienny, tygodniowy, miesięczny) – podobnie do wież Hanoi.

10.2. Algorytmy sortowania

Merge sort i quick sort używają podobnego podejścia "dziel i zwyciężaj".

10.3. Struktura danych

Implementacja niektórych struktur drzewiastych.

10.4. Gry i łamigłówki

Podstawa wielu gier logicznych.


11. Legenda o Wieżach Hanoi

Legenda: W świątyni w Benares (Indie) mnisi przenoszą 64 złote krążki na diamentowych palikach. Gdy skończą – nastąpi koniec świata!

Ile to potrwa?

Wynik:

Ruchy: 18,446,744,073,709,551,615
Lat: 584,942,417,355
Wiek wszechświata: ~13.8 miliardów lat

Wniosek: Ludzkość jest bezpieczna przez ~585 miliardów lat! 😄


12. Ćwiczenia

Zadanie 1: Zlicz ruchy bez wypisywania

Rozwiązanie

Zadanie 2: Która krążek porusza się w ruchu i?


13. Podsumowanie

Wieże Hanoi:

  • Klasyczny problem rekurencyjny
  • Minimalna liczba ruchów: 2^n - 1
  • Złożoność czasowa: O(2^n)
  • Złożoność pamięciowa: O(n) (stos wywołań)

Kluczowa idea:

  1. Przenieś (n-1) krążków na palik pomocniczy
  2. Przenieś największy krążek na cel
  3. Przenieś (n-1) krążków z pomocniczego na cel

Rekurencja vs iteracja:

  • Rekurencja: elegancka, naturalna
  • Iteracja: możliwa, ale skomplikowana

Dlaczego to ważne:

  • Wzorzec "dziel i zwyciężaj"
  • Ilustracja wykładniczej złożoności
  • Fundament dla merge sort, quick sort
  • Doskonały przykład piękna rekurencji

Najważniejsza lekcja:

Niektóre problemy są naturalnie rekurencyjne. Wieże Hanoi to perfekcyjny przykład!

Co dalej warto poznać:

  • Algorytmy "dziel i zwyciężaj"
  • Merge sort, quick sort
  • Backtracking
  • Programowanie dynamiczne