You are on page 1of 71

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Java. Algorytmy
i struktury danych
Autor: Robert Lafore
Tumaczenie: Przemysaw Kowalczyk (rozdz. 1 5),
Piotr Rajca (rozdz. 6 9), Pawe Koronkiewicz
(rozdz. 9 15, dod. A C)
ISBN: 83-7361-123-1
Tytu oryginau: Data Structures & Algorithms
in Java, 2nd Edition
Format: B5, stron: 704
Ksika Java. Algorytmy i struktury danych jest atwym do zrozumienia
podrcznikiem powiconym zoonym zagadnieniom gromadzenia i zarzdzania
danymi w taki sposb, aby uzyska maksymaln efektywno dziaania programw
komputerowych. Niezalenie od uywanej platformy systemowej oraz jzyka
programowania, opanowanie zagadnie przedstawionych w niniejszej ksice poprawi
jako i efektywno tworzonego oprogramowania. Dziki wykorzystaniu Javy
do implementacji najwaniejszych poj, uniknito problemw zwizanych ze
zoonoci jzykw C oraz C++ i w peni skoncentrowano si na prezentacji
algorytmw i struktur danych.
Autor Robert Lafore prezentuje proste i zrozumiae przykady unikajc
niepotrzebnej matematyki i skomplikowanych dowodw, czsto pojawiajcych si
w ksikach o tej tematyce. W prezentowanym drugim wydaniu ksiki, autor
udoskonali i rozbudowa przykady, wykorzystujc w nich najnowsze moliwoci Javy.
Na kocu kadego z rozdziaw zostay zamieszczone pytania i odpowiedzi,
umoliwiajce sprawdzenie stopnia zrozumienia i opanowania omawianych zagadnie.
W ksice opisano:

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Tablice
Proste i zoone algorytmy sortowania
Stosy i kolejki
Listy
Zastosowania rekurencji
Rne rodzaje drzew i sposoby ich implementacji
Tablice rozproszone
Sterty
Grafy i grafy waone
Dobr waciwych algorytmw i struktur danych
Robert Lafore pisze o programowaniu od 1982 roku. Do jego najbardziej poczytnych
ksiek nale: Object-oriented Programming in C++, ktra zostaa sprzedana
w ponad 200 tysicach egzemplarzy na caym wiecie, Assembly Language
Programming for the IBM PC, C Programming Using Turbo C++ oraz C++ Interactive
Course. Lafore posiada tytuy naukowe z matematyki i elektryki, a programowaniem
zajmuje si aktywnie od czasw, gdy krloway komputery PDP-5 i gdy 4 kB

Spis treci

O Autorze...............................................................................................................19
Drogi Czytelniku....................................................................................................20

Wprowadzenie .......................................................................................................21
Co nowego w drugim wydaniu? ....................................................................................................................... 21
Dodatkowe tematy ................................................................................................................................ 21
Pytania kocowe................................................................................................................................... 22
Eksperymenty ....................................................................................................................................... 22
Projekty programistyczne ..................................................................................................................... 22
O czym jest ta ksika? ..................................................................................................................................... 22
Czym ta ksika rni si od innych? ............................................................................................................... 23
atwa do zrozumienia .......................................................................................................................... 23
Warsztaty algorytmw.......................................................................................................................... 24
Przykady w Javie................................................................................................................................. 24
Komu moe si przyda ta ksika? ................................................................................................................. 25
Co musimy wiedzie, zanim zaczniemy j czyta? .......................................................................................... 25
Potrzebne oprogramowanie............................................................................................................................... 25
Organizacja ksiki ........................................................................................................................................... 25
Dobrej zabawy! ................................................................................................................................................. 27

1.
Przegld .................................................................................................................29
Do czego s przydatne struktury danych i algorytmy? ..................................................................................... 29
Przechowywanie danych ze wiata zewntrznego ............................................................................... 30
Narzdzia programisty.......................................................................................................................... 31
Modelowanie danych ze wiata zewntrznego..................................................................................... 31
Przegld struktur danych................................................................................................................................... 31
Przegld algorytmw ........................................................................................................................................ 31
Kilka definicji.................................................................................................................................................... 32
Baza danych.......................................................................................................................................... 32
Rekord .................................................................................................................................................. 33

SPIS TRECI

Pole ....................................................................................................................................................... 33
Klucz..................................................................................................................................................... 33
Programowanie obiektowe................................................................................................................................ 34
Problemy z jzykami proceduralnymi.................................................................................................. 34
Obiekty w telegraficznym skrcie........................................................................................................ 35
Dziaajcy program obiektowy............................................................................................................. 37
Dziedziczenie i polimorfizm ................................................................................................................ 39
Inynieria programowania................................................................................................................................. 40
Java dla programistw C++ .............................................................................................................................. 40
Brak wskanikw ................................................................................................................................. 41
Operatory przecione .......................................................................................................................... 44
Typy proste ........................................................................................................................................... 44
Operacje wejcia-wyjcia ..................................................................................................................... 44
Struktury danych w bibliotece Javy .................................................................................................................. 47
Podsumowanie .................................................................................................................................................. 47
Pytania............................................................................................................................................................... 48

2.
Tablice ...................................................................................................................49
Aplet demonstracyjny ....................................................................................................................................... 49
Wstawianie ........................................................................................................................................... 51
Wyszukiwanie ...................................................................................................................................... 51
Usuwanie .............................................................................................................................................. 52
Kwestia duplikatw .............................................................................................................................. 53
Niezbyt szybko ..................................................................................................................................... 55
Tablice w Javie.................................................................................................................................................. 55
Tworzenie tablicy ................................................................................................................................. 55
Dostp do elementw tablicy ............................................................................................................... 56
Inicjalizacja........................................................................................................................................... 56
Przykad uycia tablic........................................................................................................................... 57
Dzielenie programu na klasy............................................................................................................................. 59
Klasy LowArray i LowArrayApp......................................................................................................... 61
Interfejsy klas .................................................................................................................................................... 61
Niezbyt wygodnie................................................................................................................................. 62
Kto i za co odpowiada? ........................................................................................................................ 62
Program highArray.java ....................................................................................................................... 63
i ycie uytkownika stao si prostsze............................................................................................. 66
Abstrakcja............................................................................................................................................. 66
Aplet demonstrujcy tablic uporzdkowan ................................................................................................... 66
Wyszukiwanie liniowe ......................................................................................................................... 66
Wyszukiwanie binarne ......................................................................................................................... 67
Tablica uporzdkowana w Javie ....................................................................................................................... 69
Wyszukiwanie binarne w metodzie find()............................................................................................ 70
Klasa OrdArray..................................................................................................................................... 71
Korzyci wynikajce z uywania tablic uporzdkowanych ................................................................. 74
Logarytmy ......................................................................................................................................................... 74
Potgowanie.......................................................................................................................................... 75
Przeciwiestwo podnoszenia do potgi................................................................................................ 76
Przechowywanie obiektw................................................................................................................................ 76
Klasa Person ......................................................................................................................................... 76
Program classDataArray.java ............................................................................................................... 77

SPIS TRECI

Notacja O()........................................................................................................................................................ 81
Wstawianie do tablicy nieuporzdkowanej: czas stay......................................................................... 81
Wyszukiwanie liniowe: czas proporcjonalny do N .............................................................................. 81
Wyszukiwanie binarne: czas proporcjonalny do log(N) ...................................................................... 82
Staa niepotrzebna................................................................................................................................. 82
Czy tablice nadaj si do wszystkiego? ............................................................................................................ 83
Podsumowanie .................................................................................................................................................. 84
Pytania............................................................................................................................................................... 85
Eksperymenty.................................................................................................................................................... 86
Projekty programistyczne.................................................................................................................................. 86

3.
Proste algorytmy sortowania .................................................................................87
W szeregu zbirka!............................................................................................................................................ 88
Sortowanie bbelkowe ...................................................................................................................................... 89
Sortowanie bbelkowe zawodnikw druyny ...................................................................................... 89
Aplet demonstracyjny sortowania bbelkowego.................................................................................. 91
Sortowanie bbelkowe w Javie............................................................................................................. 94
Niezmienniki ........................................................................................................................................ 97
Wydajno sortowania bbelkowego ................................................................................................... 97
Sortowanie przez wybr.................................................................................................................................... 98
Sortowanie przez wybr druyny baseballowej ................................................................................... 98
Aplet demonstracyjny sortowania przez wybr ................................................................................. 100
Sortowanie przez wybr w Javie ........................................................................................................ 101
Niezmiennik........................................................................................................................................ 103
Wydajno sortowania przez wybr................................................................................................... 103
Sortowanie przez wstawianie .......................................................................................................................... 103
Sortowanie przez wstawianie druyny baseballowej ......................................................................... 103
Aplet demonstracyjny sortowania przez wstawianie.......................................................................... 104
Sortowanie przez wstawianie w Javie ................................................................................................ 107
Niezmiennik w sortowaniu przez wstawianie .................................................................................... 110
Wydajno sortowania przez wstawianie ........................................................................................... 110
Sortowanie obiektw....................................................................................................................................... 111
Program sortujcy tablic obiektw ................................................................................................... 111
Porwnania leksykograficzne............................................................................................................. 114
Stabilno............................................................................................................................................ 115
Porwnanie prostych algorytmw sortowania ................................................................................................ 115
Podsumowanie ................................................................................................................................................ 115
Pytania............................................................................................................................................................. 116
Eksperymenty.................................................................................................................................................. 117
Projekty programistyczne................................................................................................................................ 118

4.
Stosy i kolejki ......................................................................................................121
Inny rodzaj struktur danych............................................................................................................................. 121
Narzdzia programisty........................................................................................................................ 121
Ograniczony dostp ............................................................................................................................ 122
Bardziej abstrakcyjne ......................................................................................................................... 122
Stosy ................................................................................................................................................................ 122
Analogia pocztowa ............................................................................................................................. 123
Aplet demonstracyjny stosu................................................................................................................ 124

SPIS TRECI

Stos w Javie ........................................................................................................................................ 126


Wykorzystanie stosu do odwracania sowa ........................................................................................ 129
Wykorzystanie stosu do sprawdzania nawiasw................................................................................ 131
Wydajno stosw .............................................................................................................................. 136
Kolejki............................................................................................................................................................. 136
Aplet demonstracyjny kolejki............................................................................................................. 137
Kolejka cykliczna ............................................................................................................................... 140
Kolejka w Javie .................................................................................................................................. 141
Wydajno kolejek ............................................................................................................................. 146
Kolejki dwustronne............................................................................................................................. 146
Kolejki priorytetowe ....................................................................................................................................... 146
Aplet demonstracyjny kolejki priorytetowej ...................................................................................... 147
Kolejka priorytetowa w Javie ............................................................................................................. 150
Wydajno kolejek priorytetowych .................................................................................................... 152
Analiza wyrae arytmetycznych ................................................................................................................... 152
Notacja przyrostkowa ......................................................................................................................... 152
Zamiana notacji naturalnej na przyrostkow...................................................................................... 153
Obliczanie wyrae w notacji przyrostkowej..................................................................................... 167
Podsumowanie ................................................................................................................................................ 172
Pytania............................................................................................................................................................. 172
Eksperymenty.................................................................................................................................................. 174
Projekty programistyczne................................................................................................................................ 174

5.
Listy powizane ...................................................................................................177
Poczenia........................................................................................................................................................ 178
Referencje i typy proste ...................................................................................................................... 179
Relacja, nie pozycja ............................................................................................................................ 180
Aplet demonstracyjny listy powizanej .......................................................................................................... 181
Przycisk Ins......................................................................................................................................... 181
Przycisk Find ...................................................................................................................................... 182
Przycisk Del........................................................................................................................................ 182
Prosta lista powizana ..................................................................................................................................... 183
Klasa Link........................................................................................................................................... 183
Klasa LinkList .................................................................................................................................... 184
Metoda insertFirst() ............................................................................................................................ 185
Metoda deleteFirst() ........................................................................................................................... 186
Metoda displayList()........................................................................................................................... 187
Program linkList.java ......................................................................................................................... 187
Wyszukiwanie i usuwanie okrelonych elementw........................................................................................ 190
Metoda find()...................................................................................................................................... 193
Metoda delete()................................................................................................................................... 193
Inne metody ........................................................................................................................................ 194
Listy dwustronne ............................................................................................................................................. 194
Wydajno list powizanych........................................................................................................................... 198
Abstrakcyjne typy danych............................................................................................................................... 199
Implementacja stosu przy uyciu listy powizanej ............................................................................ 199
Implementacja kolejki przy uyciu listy powizanej ......................................................................... 202
Typy danych i abstrakcja .................................................................................................................... 205
Listy abstrakcyjne............................................................................................................................... 206
Abstrakcyjne typy danych jako narzdzia projektowe ....................................................................... 206

SPIS TRECI

Listy uporzdkowane ...................................................................................................................................... 207


Wstawianie do listy uporzdkowanej w Javie.................................................................................... 209
Program sortedList.java...................................................................................................................... 210
Wydajno list uporzdkowanych ...................................................................................................... 212
Sortowanie przez wstawianie do listy ................................................................................................ 212
Listy dwukierunkowe...................................................................................................................................... 214
Przegldanie........................................................................................................................................ 216
Wstawianie ......................................................................................................................................... 216
Usuwanie ............................................................................................................................................ 218
Program doublyLinked.java ............................................................................................................... 219
Listy dwukierunkowe jako podstawa kolejek dwustronnych............................................................. 223
Iteratory ........................................................................................................................................................... 223
Referencja w licie?............................................................................................................................ 224
Klasa iteratora..................................................................................................................................... 224
Dodatkowe moliwoci iteratorw ..................................................................................................... 225
Metody klasy iteratorowej .................................................................................................................. 226
Program interIterator.java................................................................................................................... 227
Na co wskazuje iterator?..................................................................................................................... 232
Metoda atEnd() ................................................................................................................................... 233
Operacje iteracyjne ............................................................................................................................. 233
Inne metody ........................................................................................................................................ 234
Podsumowanie ................................................................................................................................................ 235
Pytania............................................................................................................................................................. 236
Eksperymenty.................................................................................................................................................. 237
Projekty programistyczne................................................................................................................................ 237

6.
Rekurencja ...........................................................................................................239
Liczby trjktne............................................................................................................................................... 239
Okrelanie wartoci n-tego elementu przy uyciu ptli...................................................................... 240
Okrelanie wartoci n-tego elementu przy uyciu rekurencji ............................................................ 241
Program triangle.java.......................................................................................................................... 243
Co si tak naprawd dzieje? ............................................................................................................... 244
Charakterystyczne cechy metod rekurencyjnych ............................................................................... 245
Czy rekurencja jest efektywna? .......................................................................................................... 246
Indukcja matematyczna ...................................................................................................................... 247
Silnia ............................................................................................................................................................... 247
Anagramy ........................................................................................................................................................ 248
Rekurencyjne wyszukiwanie binarne.............................................................................................................. 254
Zastpienie ptli rozwizaniem rekurencyjnym ................................................................................. 255
Algorytmy dziel i zwyciaj ........................................................................................................... 258
Wiee Hanoi.................................................................................................................................................... 259
Aplet Towers Workshop..................................................................................................................... 260
Przesuwanie poddrzew ....................................................................................................................... 261
Algorytm rekurencyjny....................................................................................................................... 262
Program towers.java ........................................................................................................................... 262
Sortowanie przez scalanie ............................................................................................................................... 265
Scalanie dwch posortowanych tablic................................................................................................ 265
Sortowanie przez scalanie .................................................................................................................. 268
Applet MergeSort Workshop.............................................................................................................. 271
Program mergeSort.java ..................................................................................................................... 272
Efektywno dziaania algorytmu sortowania przez scalanie ............................................................ 276

10

SPIS TRECI

Eliminacja rekurencji ...................................................................................................................................... 278


Rekurencja i stosy............................................................................................................................... 279
Symulowanie metod rekurencyjnych ................................................................................................. 279
Czego to dowodzi? ............................................................................................................................. 284
Niektre interesujce zastosowania rekurencji ............................................................................................... 286
Podnoszenie liczby do potgi ............................................................................................................. 287
Problem plecakowy ............................................................................................................................ 288
Kombinacje: Wybieranie zespou....................................................................................................... 290
Podsumowanie ................................................................................................................................................ 292
Pytania............................................................................................................................................................. 293
Eksperymenty.................................................................................................................................................. 294
Projekty programw........................................................................................................................................ 294

7.
Zaawansowane algorytmy sortowania.................................................................297
Sortowanie Shella............................................................................................................................................ 297
Sortowanie przez wstawianie: zbyt wiele operacji kopiowania ......................................................... 298
N-sortowanie ...................................................................................................................................... 298
Usuwanie odstpw............................................................................................................................ 300
Aplet Shellsort Workshop .................................................................................................................. 301
Kod algorytmu Shella napisany w Javie............................................................................................. 303
Inne sekwencje dostpw ................................................................................................................... 306
Efektywno dziaania algorytmu Shella ........................................................................................... 306
Podzia danych ................................................................................................................................................ 307
Aplet demonstracyjny Partitioning..................................................................................................... 307
Program Partition.java ........................................................................................................................ 309
Algorytm podziau danych ................................................................................................................. 311
Efektywno dziaania algorytmu podziau........................................................................................ 314
Quicksort ......................................................................................................................................................... 314
Algorytm quicksort............................................................................................................................. 315
Wybr wartoci osiowej ..................................................................................................................... 316
Aplet demonstracyjny QuickSort1 ..................................................................................................... 321
Obnienie efektywnoci do rzdu O(N2)............................................................................................ 325
Wybr mediany trzech elementw ..................................................................................................... 326
Obsuga dzielenia niewielkich grup danych ....................................................................................... 331
Usuwanie rekurencji ........................................................................................................................... 335
Efektywno dziaania algorytmu quicksort....................................................................................... 335
Sortowanie pozycyjne ..................................................................................................................................... 338
Algorytm sortowania pozycyjnego..................................................................................................... 338
Projekt programu ................................................................................................................................ 339
Efektywno sortowania pozycyjnego ............................................................................................... 339
Podsumowanie ................................................................................................................................................ 340
Pytania............................................................................................................................................................. 341
Eksperymenty.................................................................................................................................................. 343
Projekty programw........................................................................................................................................ 343

8.
Drzewa binarne ....................................................................................................345
Dlaczego warto uywa drzew binarnych?..................................................................................................... 345
Wolne wstawianie elementw do tablicy uporzdkowanych............................................................. 346
Wolne wyszukiwanie w listach powizanych .................................................................................... 346

SPIS TRECI

11

Rozwizaniem s drzewa.................................................................................................................... 347


Czym jest drzewo?.............................................................................................................................. 347
Terminologia zwizana z drzewami................................................................................................................ 348
cieka................................................................................................................................................ 348
Korze ................................................................................................................................................ 348
Rodzic................................................................................................................................................. 349
Potomek .............................................................................................................................................. 349
Licie .................................................................................................................................................. 349
Poddrzewo .......................................................................................................................................... 350
Odwiedzanie ....................................................................................................................................... 350
Trawersowanie.................................................................................................................................... 350
Poziomy .............................................................................................................................................. 350
Klucze................................................................................................................................................. 350
Drzewa binarne................................................................................................................................... 350
Analogia .......................................................................................................................................................... 351
Jak dziaaj drzewa binarne?........................................................................................................................... 352
Aplet demonstracyjny Binary Tree..................................................................................................... 352
Reprezentacja drzew w jzyku Java ................................................................................................... 354
Wyszukiwanie wza....................................................................................................................................... 357
Wyszukiwanie wzw w aplecie demonstracyjnym Binary Tree ..................................................... 357
Kod metody wyszukujcej wze ....................................................................................................... 358
Efektywno operacji na drzewach binarnych ................................................................................... 359
Wstawianie wza............................................................................................................................................ 359
Wstawianie wzw w aplecie demonstracyjnym Binary Tree.......................................................... 359
Kod metody wstawiajcej wze ........................................................................................................ 360
Trawersowanie drzewa.................................................................................................................................... 362
Trawersowanie drzew w porzdku inorder ........................................................................................ 362
Kod metody trawersujcej drzewo ..................................................................................................... 362
Trawersowanie drzew zawierajcych trzy wzy ............................................................................... 363
Trawersowanie drzewa w aplecie demonstracyjnym Binary Tree ..................................................... 364
Trawersowanie drzew w porzdkach preorder oraz postorder ........................................................... 366
Znajdowanie wartoci maksymalnej i minimalnej.......................................................................................... 368
Usuwanie wza .............................................................................................................................................. 369
Przypadek 1. Usuwany wze nie ma potomkw ............................................................................... 370
Przypadek 2. Usuwany wze ma jednego potomka .......................................................................... 372
Przypadek 3. Usuwany wze na dwa potomki .................................................................................. 373
Efektywno operacji na drzewach binarnych ................................................................................................ 381
Przedstawianie drzew w formie tablicy .......................................................................................................... 383
Powtarzajce si klucze................................................................................................................................... 384
Program tree.java ............................................................................................................................................ 385
Kod Huffmana................................................................................................................................................. 393
Kody znakw...................................................................................................................................... 393
Dekodowanie przy wykorzystaniu drzewa Huffmana........................................................................ 395
Tworzenie drzewa Huffmana ............................................................................................................. 396
Kodowanie tekstu wiadomoci........................................................................................................... 397
Tworzenie kodw Huffmana .............................................................................................................. 398
Podsumowanie ................................................................................................................................................ 399
Pytania............................................................................................................................................................. 401
Eksperymenty.................................................................................................................................................. 402
Projekty programw........................................................................................................................................ 402

12

SPIS TRECI

9.
Drzewa czerwono-czarne.....................................................................................405
Sposb omwienia struktury........................................................................................................................... 406
Zasada dziaania ................................................................................................................................. 406
Wstawianie zstpujce........................................................................................................................ 406
Drzewa zrwnowaone i drzewa niezrwnowaone ...................................................................................... 406
Degeneracja do O(N).......................................................................................................................... 407
Rwnowaenie drzewa ....................................................................................................................... 408
Cechy drzewa czerwono-czarnego ..................................................................................................... 408
Korygowanie struktury ....................................................................................................................... 410
Aplet demonstracyjny RBTree........................................................................................................................ 410
Kliknicie obrazka wza.................................................................................................................... 411
Przycisk Start...................................................................................................................................... 411
Przycisk Ins......................................................................................................................................... 411
Przycisk Del........................................................................................................................................ 411
Przycisk Flip ....................................................................................................................................... 411
Przycisk RoL ...................................................................................................................................... 412
Przycisk RoR ...................................................................................................................................... 412
Przycisk R/B ....................................................................................................................................... 412
Komunikaty tekstowe ......................................................................................................................... 412
Gdzie jest przycisk Find? ................................................................................................................... 412
wiczenia z apletem demonstracyjnym.......................................................................................................... 413
wiczenie 2. obroty ....................................................................................................................... 414
wiczenie 3. odwracanie kolorw................................................................................................. 414
wiczenie 4. drzewo niezrwnowaone ....................................................................................... 415
Dalsze wiczenia ................................................................................................................................ 416
Reguy RB i drzewa zrwnowaone .................................................................................................. 416
Potomek pusty .................................................................................................................................... 416
Obroty ............................................................................................................................................................. 417
Proste operacje obrotu ........................................................................................................................ 417
Tajemniczy wze krzyowy .............................................................................................................. 418
Obracanie gazi drzewa..................................................................................................................... 418
Ludzie przeciw komputerom .............................................................................................................. 420
Wstawianie nowego wza .............................................................................................................................. 421
Przebieg procedury wstawiania .......................................................................................................... 421
Odwrcenia kolorw w trakcie przeszukiwania................................................................................. 422
Obroty po wstawieniu wza .............................................................................................................. 423
Obroty w trakcie przeszukiwania ....................................................................................................... 429
Usuwanie......................................................................................................................................................... 432
Wydajno drzew czerwono-czarnych............................................................................................................ 432
Implementacja drzewa czerwono-czarnego .................................................................................................... 433
Inne drzewa zrwnowaone ............................................................................................................................ 433
Podsumowanie ................................................................................................................................................ 434
Pytania............................................................................................................................................................. 434
wiczenia ........................................................................................................................................................ 436

10.
Drzewa 2-3-4 i pami zewntrzna......................................................................437
Wprowadzenie................................................................................................................................................. 437
Skd nazwa? ....................................................................................................................................... 438
Organizacja drzewa 2-3-4................................................................................................................... 439

SPIS TRECI

13

Przeszukiwanie drzewa 2-3-4 ............................................................................................................. 440


Wstawianie danych............................................................................................................................. 440
Podziay wzw................................................................................................................................. 441
Podzia korzenia ................................................................................................................................. 442
Zstpujce dzielenie wzw .............................................................................................................. 442
Aplet demonstracyjny Tree234 ....................................................................................................................... 443
Przycisk Fill........................................................................................................................................ 443
Przycisk Find ...................................................................................................................................... 444
Przycisk Ins......................................................................................................................................... 445
Przycisk Zoom.................................................................................................................................... 445
Przegldanie wzw .......................................................................................................................... 446
wiczenia ........................................................................................................................................... 447
Kod drzewa 2-3-4 w jzyku Java .................................................................................................................... 448
Klasa DataItem ................................................................................................................................... 449
Klasa Node ......................................................................................................................................... 449
Klasa Tree234..................................................................................................................................... 449
Klasa Tree234App.............................................................................................................................. 450
Peny kod programu tree234.java ....................................................................................................... 451
Drzewa 2-3-4 a drzewa czerwono-czarne ....................................................................................................... 458
Transformacja drzewa 2-3-4 do drzewa czerwono-czarnego............................................................. 458
Rwnowano operacji ..................................................................................................................... 460
Wydajno drzew 2-3-4 .................................................................................................................................. 461
Szybko............................................................................................................................................. 461
Wymagania pamiciowe..................................................................................................................... 463
Drzewa 2-3 ...................................................................................................................................................... 463
Podziay wzw................................................................................................................................. 464
Implementacja .................................................................................................................................... 466
Pami zewntrzna.......................................................................................................................................... 466
Dostp do danych zewntrznych ........................................................................................................ 467
Sekwencyjne porzdkowanie danych ................................................................................................. 470
B-drzewa............................................................................................................................................. 471
Indeksowanie ...................................................................................................................................... 476
Zoone kryteria wyszukiwania.......................................................................................................... 479
Sortowanie plikw zewntrznych....................................................................................................... 479
Podsumowanie ................................................................................................................................................ 481
Pytania............................................................................................................................................................. 483
wiczenia ........................................................................................................................................................ 484
Propozycje programw ................................................................................................................................... 485

11.
Tablice rozproszone .............................................................................................487
Algorytmy rozpraszania wprowadzenie..................................................................................................... 488
Numery pracownikw jako klucze danych ........................................................................................ 488
Sownik............................................................................................................................................... 489
Rozpraszanie....................................................................................................................................... 492
Kolizje ................................................................................................................................................ 494
Adresowanie otwarte....................................................................................................................................... 495
Aplet demonstracyjny Hash................................................................................................................ 496
Kod tablicy rozproszonej z sondowaniem liniowym ......................................................................... 500
Sondowanie kwadratowe.................................................................................................................... 507
Podwjne rozpraszanie ....................................................................................................................... 510

14

SPIS TRECI

czenie niezalene......................................................................................................................................... 516


Aplet demonstracyjny HashChain ...................................................................................................... 517
Kod czenia niezalenego w jzyku Java.......................................................................................... 519
Funkcje rozpraszajce ..................................................................................................................................... 524
Szybkie obliczanie wyniku ................................................................................................................. 524
Losowe wartoci kluczy ..................................................................................................................... 525
Nielosowe wartoci kluczy ................................................................................................................. 525
Funkcje rozpraszajce cigw znakowych......................................................................................... 526
Skadanie ............................................................................................................................................ 528
Wydajno tablic rozproszonych .................................................................................................................... 529
Adresowanie otwarte .......................................................................................................................... 529
czenie niezalene ............................................................................................................................ 531
Adresowanie otwarte a wizanie niezalene ...................................................................................... 533
Algorytmy rozpraszania i pami zewntrzna ................................................................................................ 533
Tablica wskanikw do pliku ............................................................................................................. 534
Bloki czciowo wypenione .............................................................................................................. 534
Bloki pene.......................................................................................................................................... 534
Podsumowanie ................................................................................................................................................ 535
Pytania............................................................................................................................................................. 537
wiczenia ........................................................................................................................................................ 538
Propozycje programw ................................................................................................................................... 538

12.
Sterty ....................................................................................................................541
Wprowadzenie................................................................................................................................................. 542
Kolejki priorytetowe, sterty i abstrakcyjne typy danych .................................................................... 542
Sabe uporzdkowanie ........................................................................................................................ 544
Usuwanie danych................................................................................................................................ 544
Wstawianie danych............................................................................................................................. 546
Operacja zamiany wzw.................................................................................................................. 546
Aplet demonstracyjny Heap ............................................................................................................................ 548
Przycisk Fill........................................................................................................................................ 548
Przycisk Chng..................................................................................................................................... 549
Przycisk Rem...................................................................................................................................... 549
Przycisk Ins......................................................................................................................................... 549
Przykad implementacji sterty......................................................................................................................... 549
Wstawianie danych............................................................................................................................. 550
Usuwanie danych................................................................................................................................ 551
Zmiana klucza..................................................................................................................................... 552
Rozmiar tablicy................................................................................................................................... 553
Program heap.java .............................................................................................................................. 553
Zwikszanie rozmiaru tablicy sterty................................................................................................... 558
Wydajno operacji na stercie ............................................................................................................ 559
Sterta oparta na drzewie .................................................................................................................................. 559
Sortowanie stertowe ........................................................................................................................................ 560
Opuszczanie wzw .......................................................................................................................... 561
Uycie tej samej tablicy...................................................................................................................... 563
Program heapSort.java........................................................................................................................ 563
Wydajno sortowania stertowego ..................................................................................................... 568
Podsumowanie ................................................................................................................................................ 568
Pytania............................................................................................................................................................. 569
wiczenia ........................................................................................................................................................ 570
Propozycje programw ................................................................................................................................... 570

SPIS TRECI

15

13.
Grafy ....................................................................................................................573
Wprowadzenie................................................................................................................................................. 573
Definicje ............................................................................................................................................. 574
Nota historyczna ................................................................................................................................. 576
Reprezentacja grafu w programie....................................................................................................... 577
Wstawianie wierzchokw i krawdzi ................................................................................................ 579
Klasa Graph ........................................................................................................................................ 580
Wyszukiwanie ................................................................................................................................................. 581
Wyszukiwanie wgb (DFS) ........................................................................................................... 582
Przeszukiwanie wszerz (BFS)......................................................................................................... 591
Minimalne drzewo rozpinajce ....................................................................................................................... 597
Aplet demonstracyjny GraphN........................................................................................................... 598
Kod algorytmu minimalnego drzewa rozpinajcego.......................................................................... 599
Program mst.java ................................................................................................................................ 600
Sortowanie topologiczne grafw skierowanych ............................................................................................. 603
Przykad warunki wstpne kursw ................................................................................................ 604
Grafy skierowane................................................................................................................................ 604
Sortowanie topologiczne .................................................................................................................... 605
Aplet demonstracyjny GraphD........................................................................................................... 606
Cykle i drzewa .................................................................................................................................... 607
Kod algorytmu sortowania topologicznego........................................................................................ 608
Spjno w grafach skierowanych .................................................................................................................. 613
Tabela pocze .................................................................................................................................. 614
Algorytm Warshalla ........................................................................................................................... 614
Implementacja algorytmu Warshalla.................................................................................................. 617
Podsumowanie ................................................................................................................................................ 617
Pytania............................................................................................................................................................. 617
wiczenia ........................................................................................................................................................ 618
Propozycje programw ................................................................................................................................... 619

14.
Grafy waone .......................................................................................................621
Minimalne drzewo rozpinajce grafu waonego ............................................................................................ 621
Przykad: telewizja kablowa w dungli .............................................................................................. 622
Aplet demonstracyjny GraphW .......................................................................................................... 622
Wysyamy inspektorw ...................................................................................................................... 623
Algorytm............................................................................................................................................. 627
Kod algorytmu.................................................................................................................................... 629
Program mstw.java ............................................................................................................................. 631
Problem najkrtszej cieki............................................................................................................................. 636
Linia kolejowa .................................................................................................................................... 636
Algorytm Dijkstry............................................................................................................................... 638
Agenci i podre pocigiem ............................................................................................................... 638
Aplet demonstracyjny GraphDW ....................................................................................................... 642
Kod algorytmu.................................................................................................................................... 646
Program path.java ............................................................................................................................... 650
Problem najkrtszej cieki dla wszystkich par wierzchokw ...................................................................... 654
Wydajno....................................................................................................................................................... 656

16

SPIS TRECI

Problemy nierozwizywalne ........................................................................................................................... 657


Wdrwka Skoczka ............................................................................................................................ 657
Problem komiwojaera ....................................................................................................................... 658
Cykle Hamiltona................................................................................................................................. 658
Podsumowanie ................................................................................................................................................ 659
Pytania............................................................................................................................................................. 659
wiczenia ........................................................................................................................................................ 660
Propozycje programw ................................................................................................................................... 661

15.
Waciwe stosowanie struktur i algorytmw .......................................................663
Uniwersalne struktury danych......................................................................................................................... 663
Szybko pracy i algorytmy ............................................................................................................... 664
Biblioteki ............................................................................................................................................ 665
Tablice ................................................................................................................................................ 666
Listy powizane .................................................................................................................................. 666
Drzewa przeszukiwa binarnych........................................................................................................ 666
Drzewa zrwnowaone....................................................................................................................... 667
Tablice rozproszone............................................................................................................................ 667
Porwnanie uniwersalnych struktur danych....................................................................................... 668
Wyspecjalizowane struktury danych............................................................................................................... 668
Stos ..................................................................................................................................................... 669
Kolejka................................................................................................................................................ 669
Kolejka priorytetowa .......................................................................................................................... 669
Porwnanie wyspecjalizowanych struktur danych............................................................................. 670
Sortowanie....................................................................................................................................................... 670
Grafy ............................................................................................................................................................... 671
Pami zewntrzna.......................................................................................................................................... 671
Zapis sekwencyjny ............................................................................................................................. 672
Pliki indeksowane............................................................................................................................... 672
B-drzewa............................................................................................................................................. 672
Algorytmy rozpraszania ..................................................................................................................... 672
Pami wirtualna ................................................................................................................................ 673
Co dalej?.......................................................................................................................................................... 674

A
Uruchamianie apletw demonstracyjnych i programw przykadowych............675
Aplety demonstracyjne.................................................................................................................................... 675
Programy przykadowe ................................................................................................................................... 676
Software Development Kit firmy Sun Microsystems ..................................................................................... 676
Wiersz polece ................................................................................................................................... 676
Ustawienie cieki .............................................................................................................................. 677
Wywietlanie apletw demonstracyjnych .......................................................................................... 677
Praca z apletami demonstracyjnymi ................................................................................................... 678
Uruchamianie przykadowych programw ........................................................................................ 678
Kompilowanie programw przykadowych ....................................................................................... 679
Modyfikowanie kodu rdowego...................................................................................................... 679
Koczenie pracy programw przykadowych .................................................................................... 679
Pliki klas.......................................................................................................................................................... 679
Inne systemy wspomagania programowania................................................................................................... 680

SPIS TRECI

17

B
Literatura..............................................................................................................681
Algorytmy i struktury danych ......................................................................................................................... 681
Obiektowe jzyki programowania .................................................................................................................. 682
Obiektowe projektowanie i inynieria oprogramowania ................................................................................ 682

C
Odpowiedzi na pytania sprawdzajce..................................................................683
Rozdzia 1., Przegld ................................................................................................................................... 683
Odpowiedzi na pytania ....................................................................................................................... 683
Rozdzia 2., Tablice ..................................................................................................................................... 684
Odpowiedzi na pytania ....................................................................................................................... 684
Rozdzia 3., Proste algorytmy sortowania ................................................................................................... 684
Odpowiedzi na pytania ....................................................................................................................... 684
Rozdzia 4., Stosy i kolejki .......................................................................................................................... 685
Odpowiedzi na pytania ....................................................................................................................... 685
Rozdzia 5., Listy powizane....................................................................................................................... 685
Odpowiedzi na pytania ....................................................................................................................... 685
Rozdzia 6., Rekurencja............................................................................................................................... 686
Odpowiedzi na pytania ....................................................................................................................... 686
Rozdzia 7., Zaawansowane algorytmy sortowania .................................................................................... 686
Odpowiedzi na pytania ....................................................................................................................... 686
Rozdzia 8., Drzewa binarne........................................................................................................................ 687
Odpowiedzi na pytania ....................................................................................................................... 687
Rozdzia 9., Drzewa czerwono-czarne ........................................................................................................ 687
Odpowiedzi na pytania ....................................................................................................................... 687
Rozdzia 10., Drzewa 2-3-4 i pami zewntrzna ....................................................................................... 688
Odpowiedzi na pytania ....................................................................................................................... 688
Rozdzia 11., Tablice rozproszone............................................................................................................... 688
Odpowiedzi na pytania ....................................................................................................................... 688
Rozdzia 12., Sterty...................................................................................................................................... 689
Odpowiedzi na pytania ....................................................................................................................... 689
Rozdzia 13., Grafy...................................................................................................................................... 689
Odpowiedzi na pytania ....................................................................................................................... 689
Rozdzia 14., Grafy waone......................................................................................................................... 689
Odpowiedzi na pytania ....................................................................................................................... 689

Skorowidz ............................................................................................................691

6
Rekurencja

W tym rozdziale:

Liczby trjktne.
Silnia.
Anagramy.
Rekurencyjne wyszukiwanie binarne.
Wiee Hanoi.
Sortowanie przez scalanie.
Eliminacja rekurencji.
Niektre interesujce zastosowania rekurencji.

Rekurencja jest technik programistyczn, polegajc na wywoywaniu funkcji wewntrz niej


samej. Mona sdzi, e postpowanie takie jest dziwne, a nawet, e jest ono katastrofalnym bdem.
Niemniej jednak rekurencja jest jedn z najbardziej interesujcych technik programistycznych i to
w dodatku technik zaskakujco efektywn. Z pocztku moe si wydawa, e rekurencja jest
czym niesamowitym, czym co mona by porwna z cigniciem siebie samego za sznurowada
butw (masz sznurowada, nieprawda?). Niemniej jednak rekurencja nie tylko dziaa, lecz co wicej, daje unikaln pojciow podstaw do rozwizywania wielu problemw.
W tym rozdziale zostan przedstawione liczne przykady pokazujce szerok gamm sytuacji,
w ktrych mona zastosowa rekurencj. Midzy innymi zostanie zaprezentowany sposb obliczania
liczb trjktnych, silni, generacji anagramw, wyszukiwania binarnego, rozwizywania problemu
Wie Hanoi oraz sortowania przez scalanie. Przedstawione zostan take aplety demonstrujce problem Wie Hanoi oraz sortowania przez scalanie.
W rozdziale zostan take omwione mocne i sabe strony rozwiza rekurencyjnych oraz
sposb przeksztacania algorytmw rekurencyjnych na algorytmy wykorzystujce stos.

Liczby trjktne
Twierdzi si, e pitagorejczycy grupa greckich matematykw pracujcych pod przewodnictwem
Pitagorasa (autor synnego twierdzenia nazwanego jego nazwiskiem) czuli mistyczny zwizek
z cigiem liczb: 1, 3, 6, 10, 15, 21, (gdzie trzykropek oznacza, e cig jest nieskoczony). Czy
jeste w stanie okreli kolejn liczb tego cigu?

240

6. REKURENCJA

N-ty element cigu jest uzyskiwany poprzez dodanie liczby n do poprzedniego elementu cigu.
A zatem, drugi element cigu to 2 plus warto pierwszego elementu (czyli 1), co daje 3. Trzeci element cigu to 3 plus 3 (warto drugiego elementu), co daje 6; i tak dalej.
Liczby nalece do tego cigu s nazywane liczbami trjktnymi, gdy mona je przedstawi
za pomoc odpowiedniej iloci obiektw rozmieszczonych w formie trjkta. Na rysunku 6.1 uyto
w tym celu niewielkich trjktw.

RYSUNEK 6.1.
Liczby trjktne

Okrelanie wartoci n-tego elementu przy uyciu ptli


Zamy, e chcemy znale warto pewnego (dowolnego) elementu cigu na przykad, czwartego elementu (ktrego warto wynosi 10). W jaki sposb mona j obliczy? Po przeanalizowaniu
rysunku 6.2 mona by doj do wniosku, e mona w tym celu zsumowa wszystkie kwadraciki w poszczeglnych kolumnach.

RYSUNEK 6.2.
Liczba trjktna
przedstawiona
w postaci kolumn

241

LICZBY TRJKTNE

W czwartym elemencie cigu pierwsza kolumna zawiera cztery kwadraciki, druga trzy kwadraciki, i tak dalej. Dodajc 4 + 3 + 2 + 1 uzyskujemy warto 10.
Przedstawiona poniej metoda 
oblicza liczby trjktne, wykorzystujc opisan wczeniej metod kolumnow. Sumuje ona wszystkie kolumny, zaczynajc od tej o wysokoci n i koczc na kolumnie o wysokoci 1:
   

    
   
     

                
 !  
""         
#
   
#

Metoda wykonuje zawarto ptli n razy; za pierwszym razem do zmiennej   dodawana
jest warto n, za drugim n 1 i tak dalej, a do wartoci 1. Ptla koczy si w momencie, gdy
zmienna n osignie warto 0.

Okrelanie wartoci n-tego elementu przy uyciu rekurencji


Metoda wykorzystujca ptl moe si wydawa bardzo prosta, jednak istnieje take inny sposb podejcia do zagadnienia. Ot warto n-tego elementu mona potraktowa jako sum dwch liczb,
a nie sum wszystkich elementw cigu. Liczbami tymi s:
(1) Pierwsza (najwysza) kolumna o wartoci n.
(2) Suma wszystkich pozostaych kolumn.
Podejcie takie przedstawia rysunek 6.3.

RYSUNEK 6.3.
Liczba trjktna jako
suma kolumny i trjkta

Okrelanie wartoci pozostaych kolumn


Znajc sposb obliczania sumy pozostaych kolumn, mona by zmodyfikowa metod 

zwracajc warto n-tej liczby trjktnej w nastpujcy sposb:

242

6. REKURENCJA

   


     $ ! %&   

    '(
#

Jednak jaka jest zaleta tego rozwizania? Mona sdzi, e napisanie metody  $ ! %"
&  
jest rwnie zoonym zadaniem jak napisanie metody 
przedstawionej w poprzedniej czci rozdziau.
Patrzc na rysunek 6.3 mona jednak zauway, e suma wszystkich pozostaych kolumn dla
n-tego elementu cigu jest taka sama jak warto wszystkich kolumn elementu n 1. A zatem,
znajc metod sumujc wszystkie kolumny elementu n-tego, mona by jej uy do obliczenia wszystkich pozostaych kolumn tego elementu, przekazujc w jej wywoaniu argument n 1:
   


     )!%&    " 

    '(
#

Zastanawiajc si nad powysz metod, mona doj do wniosku, e robi ona dokadnie to
samo co metoda 
, czyli sumuje wszystkie kolumny dla pewnej wartoci n, przekazanej
jako argument jej wywoania. Czy zatem nie mona by uy samej metody 
zamiast wprowadzania kolejnej metody? Rozwizanie takie miaoby nastpujc posta:
   


     "

    '(
#

By moe pomys, aby metoda wywoywaa sam siebie jest nieco szokujcy, ale dlaczego miaoby to by niemoliwe? W kocu wywoanie metody jest (midzy innymi) przekazaniem sterowania
na pocztek okrelonej metody. To przekazanie moe by wykonane zarwno spoza metody jak i z jej
wntrza.

Przekazywanie koszyka
Wszystkie te metody mog nieco przypomina przekazywanie koszyka. Kto kae nam okreli
warto dziewitej liczby trjktnej. Wiemy, e jej warto to * plus warto smej liczby trjktnej, zatem woamy Henia i prosimy go po okrelenie wartoci smej liczby trjktnej. Gdy Henio
udzieli nam odpowiedzi, podan przez niego warto dodajemy do 9 i w ten sposb uzyskujemy
poszukiwan odpowied.
Henio wie, e sma liczba trjktna to 8 plus warto sidmej liczby trjktnej, dlatego woa
Sabink i prosi j o obliczenie sidmej liczby trjktnej. Ten proces powtarza si, a kada kolejna
osoba przekazuje koszyk nastpnej.
W ktrym momencie to przekazywanie koszyka koczy si? W pewnym momencie kto musi
by w stanie poda odpowied bez koniecznoci proszenia o pomoc kolejnej osoby. Gdyby to si nie
zdarzyo, powstaby nieskoczony acuch osb, proszcych kolejne osoby o pomoc co w stylu
arytmetycznego schematu Ponziego, ktry nigdy by si nie zakoczy. W przypadku metody "

oznaczaoby to, e metoda ta w wywoywaaby sam siebie w nieskoczonej sekwencji, ktra
doprowadziaby do awarii programu.

LICZBY TRJKTNE

243

W tym miejscu koczy si przekazywanie koszyka


Aby zapobiec powstaniu nieskoczonej sekwencji wywoa, osoba poproszona o podanie wartoci
pierwszej liczby trjktnej (czyli liczby, dla ktrej n przyjmuje warto 1), musi widzie e warto
ta wynosi 1, i to bez proszenia o pomoc kogokolwiek innego. W takim przypadku nie mona ju
prosi kogo o obliczenie mniejszej liczby trjktnej, nie mona ju do niej doda niczego innego,
a zatem wanie w tym momencie koczy si przekazywanie koszyka. Warunek ten mona wyrazi
poprzez dodanie do metody 
odpowiedniej instrukcji warunkowej:
   


+ 

  

     "


#

Warunek, ktry sprawia, e metoda rekurencyjna zwraca warto bez kolejnego wywoania, nazywany jest przypadkiem bazowym. Umieszczenie takiego warunku w kadej metodzie rekurencyjnej ma kluczowe znaczenie, gdy tylko dziki niemu metoda nie wywouje samej siebie w nieskoczono, doprowadzajc w kocu do awarii programu.

Program triangle.java
Czy metody rekurencyjne sprawdzaj si w praktyce? Uruchamiaj program triangle.java mona si
przekona, e tak. Po podaniu numeru obliczanego elementu (liczby n), program wywietli warto
odpowiedniej liczby trjktnej. Kod programu zosta przedstawiony na listingu 6.1.
LISTING 6.1.
Program triangle.java
 ,-
 $  !%!  % %!. /0%
 1.  %  '  ' 2 3- 41''
'  -, ,5

% 41''

%  6 .
' .% % -   789 
  :;<=%' 

7, ,' >$  %!.2 >

6 .  :

 1   6 .

7, ,' >) % %!.  >1

#   %   

244

6. REKURENCJA

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% %    


+ 

  

     "


#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % 7 7
  :;<=%' 

:' 7?    :' 7? 7,

@ ++? .   @ ++? 

7   .,A

  
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% %  :
  :;<=%' 

7   7

  :,': 

#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#   %  41''


Gwna metoda programu 


prosi uytkownika o podanie wartoci n, a nastpnie
wywietla warto wynikow. Z kolei metoda 
wykonuje cae zadanie, wywoujc rekurencyjnie sama siebie.
Oto przykadowe wyniki dziaania programu:
$  %!.2 
) % %!.    BB

Jeli nie jeste przekonany co do poprawnoci dziaania metody 


, to tak si skada,
e warto liczby trjktnej mona take wyznaczy przy uyciu poniszego wzoru:
warto n-tej liczby trjktnej = (n2 + n) / 2

Co si tak naprawd dzieje?


Zmodyfikujmy nieco metod 
, tak aby mie wgld w to co si dzieje podczas jej wykonywania. Do kodu oryginalnej metody wstawimy wywoania metody '
, ktre zapewni nam
dostp do informacji o przekazywanych argumentach i zwracanych wartociach wynikowych:
' .% %    


7, ,' >C % 2 >  


LICZBY TRJKTNE

245

+ 


7, ,' >D%  %  >

  
#


 '     "

7, ,' >D%  %  >  '

  '
#
#

Poniej zostay przedstawione wyniki wygenerowane przez zmodyfikowan metod 


,
gdy uytkownik wpisa warto 5:
$  %!.2 
C % 2 B
C % 2 E
C % 2 F
C % 2 G
C % 2 
D%  %  
D%  %  F
D%  %  H
D%  %  
D%  %  B
) % %!.    B

Za kadym razem gdy metoda 


wywouje sama siebie, argument jej wywoania (ktry pocztkowo przyjmuje warto 5) jest pomniejszany o 1. Kolejne wywoania metody s kontynuowane a do momentu, gdy argument wywoania przyjmie warto 1. W tym momencie metoda
zwraca warto wynikow. Doprowadza to do zwracania wartoci i zakaczania kolejnych wywoa
metody 
metoda cofa si coraz wyej w sekwencji wywoa. Za kadym razem wynik zwrcony przez metod jest dodawany do wartoci n przekazanej jako argument jej wywoania.
Wartoci wynikowe podsumowuj sekwencj liczb trjktnych, ktra koczy si przekazaniem wartoci wynikowej do metody 
. Rysunek 6.4 przedstawia, e kade wywoanie metody

mona sobie wyobrazi jako zdarzenie zachodzce wewntrz wczeniejszego wywoania.
Naley zauway, e tu przed momentem gdy najbardziej wewntrzne wywoanie metody

zwrci warto 1, istnieje jednoczenie a pi inkarnacji (wywoa) tej metody. Do
najbardziej zewntrznego wywoania zostaa przekazana warto 5, a do najbardziej wewntrznego
warto 1.

Charakterystyczne cechy metod rekurencyjnych


Cho metoda 
jest bardzo krtka, zawiera jednak wszystkie elementy charakterystyczne
dla wszystkich procedur rekurencyjnych:

246

6. REKURENCJA

RYSUNEK 6.4.
Rekurencyjna
metoda triangle()

Wywouje sama siebie.


Jeli wywouje sama siebie, to robi to w celu rozwizania mniejszego problemu.
Istnieje pewna wersja problemu, ktra jest na tyle prosta, e metoda moe j obliczy bez koniecznoci ponownego wywoywania samej siebie.
W kadym kolejnym rekurencyjnym wywoaniu metody przekazywany do niej argument staje
si mniejszy (lub, by moe, mniejszym staje si zakres opisywany przez kilka przekazywanych argumentw); co odzwierciedla fakt, e rozwizywany problem staje si mniejszy lub prostszy. Gdy
argument lub zakres dojdzie do pewnej minimalnej wielkoci, zostaje speniony warunek, a metoda
zwraca warto bez kolejnego wywoywania samej siebie.

Czy rekurencja jest efektywna?


Wywoywanie metody wie si z pewnymi narzutami. Konieczne jest przekazanie sterowania
z miejsca w jakim znajduje si aktualnie na pocztek metody. Co wicej, naley zapisa na wewntrznym stosie adres miejsca gdzie ma by przekazane sterowanie po zakoczeniu metody oraz jej argumenty, tak aby metoda miaa dostp do przekazywanych wartoci i wiedziaa, gdzie zwrci warto
wynikow.

247

SILNIA

W przypadku metody 


jest cakiem moliwe, i narzuty te sprawiaj, e rozwizanie bazujce na wykorzystaniu ptli  jest bardziej efektywne od rozwizania rekurencyjnego.
Pogorszenie efektywnoci moe nie by znaczce, niemniej jednak, jeli rekurencyjne rozwizanie
problemu wymaga wykonania bardzo wielu wywoa metody, to celowe moe si okaza skorzystanie z rozwizania, ktre nie bazuje na rekurencji. Zagadnienia te zostan dokadniej opisane na
kocu rozdziau.
Kolejnym czynnikiem pogarszajcym efektywno dziaania metod rekurencyjnych jest fakt,
e wszystkie porednie argumenty i zwracane wartoci s przechowywane na wewntrznym stosie.
W przypadku gdy iloci danych przechowywanych w ten sposb s bardzo due, moe to doprowadzi do przepenienia stosu.
Rekurencja jest zazwyczaj uywana nie ze wzgldu na swoj efektywno, lecz dlatego, e
jest w stanie pojciowo uproci rozwizanie problemu.

Indukcja matematyczna
Rekurencja jest programistycznym odpowiednikiem indukcji matematycznej. Indukcja matematyczna to sposb definiowania pewnego zagadnienia poprzez to zagadnienie (ten sam termin jest take
uywany w odniesieniu do podobnej metody udowadniania poprawnoci twierdze). Wykorzystujc
indukcj matematyczn mona zdefiniowa liczby trjktne w nastpujcy sposb:
tri(n) = 1
tri(n) = n + tri(n 1)

jeli n = 1
jeli n > 1

Definiowanie pewnego zagadnienia przy uyciu jego samego moe si bardzo wydawa dziwne, niemniej jednak sposb ten jest cakowicie poprawny (zakadajc, e istnieje warunek bazowy).

Silnia
Silnia jest pojciowo zbliona do liczb trjktnych, z t rnic, i zamiast dodawania jest uywane mnoenie. Liczba trjktna dla pewnej wartoci n jest okrelana poprzez dodanie tej wartoci do
liczby trjktnej odpowiadajcej wartoci n 1. Z kolei warto n silnia uzyskiwana jest poprzez
pomnoenie n razy warto n 1 silnia. Oznacza to, e wartoci pitej liczby trjktnej jest 5 + 4
+ 3 + 2 + 1, natomiast 5 silnia to 5 4 3 2 1, co daje 120. W tabeli 6.1 zostay przedstawione
silnie liczb od 0 do 9.
Na mocy definicji warto 1 silnia wynosi 1. Jak wida wartoci silni rosn niezwykle szybko.
Silnie mona oblicza przy uyciu metody rekurencyjnej przypominajcej metod 
.
Oto jej kod:
%  +%   


+ 

  

   5 +%  "


#

248

6. REKURENCJA

TABELA 6.1.
Silnie
Liczba

Obliczenie

Silnia

0
1
2
3
4
5
6
7
8
9

z definicji
11
21
32
46
5 24
6 120
7 720
8 5 040
9 40 320

1
1
2
6
24
120
720
5 040
40 320
362 880

Istniej jedynie dwie rnice pomidzy metodami +% 


oraz 
. Po pierwsze
w metodzie +% 
jest uywany operator mnoenia (5), a nie dodawania ():
 5 +%  "

A po drugie, warunek bazowy zachodzi w przypadku gdy argument  ma warto 0, a nie 1, jak to
byo w przypadku metody 
. Poniej zostay przedstawione przykadowe wyniki wygenerowane przez program obliczajcy silni, podobny do programu triangle.java:
$  %!.2 
7  IG

Rysunek 6.5 pokazuje, w jaki sposb kolejne inkarnacje metody +% 
wywouj same
siebie, w przypadku gdy w pierwszym wywoaniu zostaa przekazana warto 4.
Obliczenie silni jest klasycznym sposobem prezentacji zagadnienia rekurencji. Niemniej jednak
sposobu obliczania silni nie mona przedstawi w sposb graficzny rwnie atwo jak wyznaczania
liczb trjktnych.
W podobny, rekurencyjny sposb mona rozwizywa wiele innych problemw numerycznych,
takich jak obliczanie najwikszego wsplnego dzielnika dwch liczb (sucego do uzyskania jak
najmniejszego uamka), podnoszenie liczby do potgi, i tak dalej. Take w tych przypadkach s to
jedynie ciekawe sposoby prezentacji algorytmw rekurencyjnych, ktre nie bd zapewne uywane w praktyce, gdy algorytmy wykorzystujce ptle s znacznie bardziej efektywne.

Anagramy
W tej czci rozdziau zosta przedstawiony kolejny problem, ktry w elegancki sposb mona
rozwiza przy uyciu rekurencji. Permutacja jest rozmieszczeniem elementw w cile okrelonej
kolejnoci. Zamy, e chcielibymy stworzy list anagramw pewnego sowa czyli wszystkie
permutacje liter tworzcych dane sowo (niezalenie do tego, czy uzyskane w ten sposb cigi liter tworz sensowne sowa, czy te nie). Stworzenie listy anagramw sowa kot daoby nastpujce wyniki:

ANAGRAMY

249

RYSUNEK 6.5.
Rekurencyjna
metoda factorial()

kot,
kto,
otk,
okt,
tok,
tko.

Warto sprbowa samodzielnie uoy tak list anagramw. Mona si przekona, e ilo dostpnych moliwoci odpowiada silni z iloci liter tworzcych sowo. Dla 3 liter istnieje 6 moliwych
sw, dla 4 liter 24 sowa, dla 5 liter 120 sw, i tak dalej (zakadamy przy tym, e wszystkie
litery sowa s unikalne; w przypadku powtarzania si liter ilo uzyskiwanych sw bdzie mniejsza).
W jaki sposb mona by napisa program tworzcy anagramy sowa? Oto jedno z moliwych
rozwiza. Zamy, e sowo skada si z n liter.
(1) Utworzenie anagramw n 1 liter sowa z pominiciem skrajnej lewej litery.
(2) Cykliczne przesunicie wszystkich n liter.
(3) Powtrzenie powyszych czynnoci n razy.

250

6. REKURENCJA

Cykliczne przesunicie sowa oznacza przesunicie wszystkich jego liter o jedn pozycj w lewo,
z wyjtkiem skrajnej, lewej litery, ktra jest zapisywana z prawej strony wyrazu, tak jak pokazano
na rysunku 6.6.

RYSUNEK 6.6.
Cykliczne
przesuwanie sowa

Cykliczne przesuwanie sowa n razy powoduje, e kada litera znajdzie si na jego pocztku.
W momencie gdy dana litera sowa zajmuje miejsce na jego pocztku, tworzone s anagramy wszystkich pozostaych liter (czyli s one zapisywane na wszystkich moliwych pozycjach). Dla sowa kot
skadajcego si wycznie z trzech liter, cykliczne przesunicie dwch pozostaych liter sprowadza
si do zamienienia ich miejscami. Caa sekwencja tworzenia anagramw sowa kot zostaa przedstawiona w tabeli 6.2.
TABELA 6.2.
Tworzenie anagramw sowa kot
Sowo

Wywietla?

Pierwsza litera

Pozostae litery

Operacja

MQV
MVQ
MQV
QVM
QMV
QVM
VMQ
VQM
VMQ
MQV

Tak
Tak
Nie
Tak
Tak
Nie
Tak
Tak
Nie
Nie

M
M
M
Q
Q
Q
V
V
V
M

QV
VQ
QV
VM
MV
VM
MQ
QM
MQ
QV

Cyklicznie przesuwamy QV
Cyklicznie przesuwamy VQ
Cyklicznie przesuwamy MQV
Cyklicznie przesuwamy VM
Cyklicznie przesuwamy MV
Cyklicznie przesuwamy QVM
Cyklicznie przesuwamy MQ
Cyklicznie przesuwamy QM
Cyklicznie przesuwamy VMQ
Gotowe

Naley zauway, e przed przesuniciem sowa trzyliterowego konieczne jest dodatkowe przesunicie sowa dwuliterowego, ktre przywraca ich oryginaln kolejno. W ten sposb generowana
jest sekwencja sw:  ,  ,  . Powtarzajce si sowa nie s wywietlane.

ANAGRAMY

251

A w jaki sposb mona stworzy anagramy n 1 liter oryginalnego sowa? Wystarczy wywoa
t sam metod. Rekurencyjna metoda  1
pobiera tylko jeden argument liczb okrelajc wielko sowa, dla ktrego naley utworzy anagramy. Sowo to tworzy n liter oryginalnego
sowa, zapisanych z jego prawej strony. Za kadym razem gdy metoda  1
wywouje sama
siebie, przetwarzane sowo jest o jedn liter krtsze ni poprzednio, co pokazano na rysunku 6.7.

RYSUNEK 6.7.
Rekurencyjna metoda
doAnagram()

Warunek bazowy jest speniony w momencie gdy sowo, dla ktrego metoda ma utworzy list anagramw, ma dugo jednej litery. W takim przypadku wykonywanie metody koczy si, gdy
nie mona zmieni kolejnoci w jakiej jest zapisana jedna litera. W kadym innym przypadku, metoda tworzy list anagramw wszystkich liter przekazanego sowa, z wyjtkiem jego skrajnej lewej
litery, a nastpnie cyklicznie przesuwa cae sowo. Te dwie czynnoci s wykonywane n razy, gdzie n
jest dugoci sowa przekazanego w wywoaniu metody. Poniej zosta przedstawiony kod rekurencyjnej metody  1
:

252

6. REKURENCJA

' .% % -   1  7!


+ 7!  
  (  !. (
    J%!
+    K7! 
   ' !%

 1 7!"
   !  ' ! (% 
+ 7!G
  .! !(L.   (
') 
   ( 
  7!

#
#

Za kadym razem gdy metoda  1


wywouje sama siebie, sowo na jakim operuje jest
mniejsze o jedn liter, a jego pocztek jest przesuwany o jedn liter w prawo. Proces ten zosta
przedstawiony na rysunku 6.8.

RYSUNEK 6.8.
Coraz mniejsze wyrazy

Peny kod programu anagram.java przedstawiono na listingu 6.2. Metoda 


pobiera sowo
podane przez uytkownika, zapisuje je w tablicy znakw, tak aby mona na nim operowa w konwencjonalny sposb, a nastpnie wywouje metod  1
.
LISTING 6.2.
Program anagram.java
 ,-
 $    
 1.  %  ' 2 3- 11''
'  -, ,5

% 11''

%  !
%  % 
% %89 3   %89
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % -   789 
  :;<=%' 

ANAGRAMY

7, ,' >)'!   2 >


  ' . ( 
7 '   7

!  ' ,
     !
%   
+    K! 
 !'   .%
389  ' ,%1 

 1 !
    
#   %   

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % -   1  7!


 
+ 7!  
  (  !. (M
    J%!    
+    K7! 
   ' !%M

 1 7!"
   ' ! (% 
+ 7!G
  .! L!M
') 
   ( 
  7!
  '!  %%! ( 
#
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
   '!  0 ' !%L   ! 
  '  ' !%    J% ( 
' .% % -     7!


 
 '    ! " 7!
% '  38'  9  !'L  '!0 L
+  '   K! 
 '!  ' ! (
38"9  389
38"9  '  !'  '!0   J%
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % -  ') 


+ %  K **

7, ,' > >



+ %  K *

7, ,' > >



7, ,' %   > >

+    K! 

7, ,' 389



7, ,' > >

7, ,+ 

+ % NH  

7, ,' >>



#

253

254

6. REKURENCJA

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % 7 7
  :;<=%' 

:' 7?    :' 7? 7,

@ ++? .   @ ++? 

7   .,A

  
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#   %  11''


Metoda  
cyklicznie przesuwa sowo o jedn liter w lewo, w sposb opisany we wczeniejszej czci rozdziau. Metoda ') 
wywietla sowo, dodajc do niego liczb uatwiajc okrelenie iloci wygenerowanych sw. Poniej zostay przedstawione przykadowe wyniki
wygenerowane przez program:
)'!   2 
  G  F  E  B  H 
I  O  *      G 
F  E  B  H  I  O 
*  G  G  GG  GF  GE 

Przedstawionego programu mona uywa do generowania anagramw sw picio-, a nawet


szecioliterowych. Niemniej jednak, poniewa silnia liczby 6 ma warto 720, prba sporzdzenia
anagramw dla tak dugiej sekwencji znakw moe powodowa wygenerowanie wikszej iloci sw,
ni bymy sobie tego yczyli.

Rekurencyjne wyszukiwanie binarne


Czy Czytelnik przypomina sobie wyszukiwanie binarne omawiane w rozdziale 2., Tablice? Jego
celem byo odnalezienie konkretnej komrki w posortowanej tablicy przy uyciu minimalnej iloci
porwna. Zastosowane rozwizanie polegao na podzieleniu tablicy na dwie powki, sprawdzeniu,
w ktrej z nich znajduje si poszukiwana komrka, podzieleniu tej poowy tabeli na poow i tak
dalej. Poniej zosta przedstawiony kod oryginalnej metody +
:
' .%  +   %&


  @   
 ''@   <"
 % :
  


% :   @   ''@ 
 G
+ 8% :9%&

  % :  !! 

REKURENCYJNE WYSZUKIWANIE BINARNE

255

 +  @   ''@ 

  <     !P


  ! !

+ 8% :9 K %&

 @   % :      / ' (/%



''@   % : "       ' (/%
#   %  !   !0% !
#   % 
#   % + % +

By moe warto przeczyta fragment dotyczcy przeszukiwania binarnego w tablicach uporzdkowanych zamieszczony w rozdziale 2., wyjaniajcy zasad dziaania powyszej metody. Mona take uruchomi aplet orderedArray.java przedstawiony w rozdziale 2., aby przekona si jak
dziaa wyszukiwanie binarne.
Powyszy algorytm wykorzystujcy ptl stosunkowo atwo mona przeksztaci na algorytm
rekurencyjny. W metodzie bazujcej na ptli najpierw modyfikowane s wartoci zmiennych  "
@  lub ''@  okrelajcych przeszukiwany zakres, a nastpnie wykonywana jest pozostaa
cz ptli. Kade wykonanie ptli powoduje podzielenie zakresu (mniej wicej) na poow.

Zastpienie ptli rozwizaniem rekurencyjnym


W rozwizaniu rekurencyjnym, zamiast modyfikowania wartoci zmiennych  @  lub ''"
@ , nowe wartoci tych zmiennych s przekazywane w kolejnym wywoaniu metody +
. Ptla
znika, a jej miejsce zajmuje rekurencyjne wywoanie. Oto jak wyglda nowa wersja metody:
'-  %Q   %&M   @ M
 ''@ 


 % :
% :   @   ''@ 
 G
+ 8% :9%&

  % :  !! 


 +  @   ''@ 

  <     !P


  ! !

+ 8% :9 K %&
  / ' (/% !
  %Q %&M % :M ''@ 

     ' (/% !
  %Q %&M  @ M % :"

#   %  !   !0% !
#   %   %Q

Uytkownik klasy reprezentowany przez metod 


moe nie wiedzie, jak wielko ma
przeszukiwana tablica w momencie wywoywania metody +
, a co wicej, pod adnym pozorem nie powinien by zmuszany do samodzielnego okrelania pocztkowych wartoci zmiennych

256

6. REKURENCJA

''@  oraz  @ . Dlatego te zostaa stworzona specjalna porednia, publiczna metoda
+
. Jest ona wywoywana przez metod 
, a w jej wywoaniu naley przekaza tylko jeden
argument warto poszukiwanego klucza. Metoda +
podaje poprawne pocztkowe wartoci zmiennych  @  oraz ''@  (ktrymi s odpowiednio:  oraz <"), a nastpnie
wywouje prywatn rekurencyjn metod %Q
. Poniej przedstawiono kod metody +
:
' .%  +   %&


  %Q %&M M <"

#

Peny kod programu binarySearch.java zosta przedstawiony na listingu 6.3.


LISTING 6.3.
Program binarySearch.java
 .7%,-
 $!   %   !  .
 1.   ' 2 3- @7%1''

% 1

'-  89    (  .% 
'-  <    / .%
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% 1  =
    

    8=9   ! .%L
<  
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%  !

  < #
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%  +   %&


  %Q %&M M <"

#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'-  %Q   %&M   @ M
 ''@ 


 % :
% :   @   ''@ 
 G
+ 8% :9%&

  % :  !! 


 +  @   ''@ 

  <     !P


  ! !

REKURENCYJNE WYSZUKIWANIE BINARNE

+ 8% :9 K %&


  / ' (/% !
  %Q %&M % :M ''@ 

     ' (/% !
  %Q %&M  @ M % :"

#   %  !   !0% !
#   %   %Q

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% -     - 
 !'   .%

 
+   K< 
  !  !'
+ 89  - 
 !   

.
+   <  ""
 L!  '!   /L
89  8"9
89  -    
<  ' L!   .%
#   

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% -  '
  ! % .%

+    K< 
    .%M
7, ,' 89  > >
   
7, ,' >>

#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#   %  1

% @7%1''

' .% % -   789 


 =7!      .%
1    (  .%
   1 =7!
   ! .%L
, IG
  !'  
, *

, EB

, GH

, BE

, **

, EE

, GI

, FB

, O

, O

, O

, *

, I

, HF

, FH


257

258

6. REKURENCJA

,'
   .%L
 %&  GI  !  
+ ,+ %&
R ,!

7, ,' >D!  >  %&




7, ,' >6 !!  >  %&

#   %   

#   %  @7%1''




Wewntrz metody 


w tablicy zapisywanych jest 16 liczb. Metoda 
zapisuje je
w kolejnoci rosncej. Po wstawieniu elementw zawarto caej tablicy jest wywietlana. W kocu
wywoywana jest metoda +
, podejmujca prb odszukania wartoci kluczowej 27. Oto przykadowe wyniki wykonania programu:
* O GI FH EB BE HF IG O * ** O I GH FB EE
D!  GI

W programie binarySearch.java w tablicy zostao zapisanych 16 liczb. Na rysunku 6.9 pokazano, w jaki sposb metoda %Q
rekurencyjnie wywouje sam siebie, za kadym razem zmniejszajc przeszukiwany zakres tablicy. Gdy wewntrzne wywoanie metody odnajdzie poszukiwany
element, ktry w tym przypadku ma warto 27, metoda koczy dziaanie i zwraca indeks odnalezionej wartoci, ktry w naszym przypadku ma warto 2 (o czym mona si take przekona, analizujc wywietlon zawarto tablicy). Warto wynikowa jest nastpnie przekazywana jako wynik kadego wywoania metody %Q
, a w kocu metoda +
zwraca go uytkownikowi klasy.
Rekurencyjny algorytm wyszukiwania binarnego ma t sam zoono dziaania co algorytm
wykorzystujcy ptl zoono O(logN). Jest on nieco bardziej elegancki, cho jednoczenie nieco
wolniejszy.

Algorytmy dziel i zwyciaj


Rekurencyjne wyszukiwanie binarne jest przykadem algorytmu typu dziel i zwyciaj. Zasada dziaania algorytmw tego typu polega na podzieleniu duego problemu na mniejsze, a nastpnie niezalenego rozwizywania kadego z nich. Rozwizanie kadego z mniejszych problemw jest takie
samo jest on dzielony na jeszcze mniejsze problemy, ktre nastpnie zostaj rozwizane niezalenie od siebie. Ten proces podziau na coraz to mniejsze problemy jest kontynuowany a do momentu uzyskania przypadku bazowego, ktry mona rozwiza w prosty sposb bez dalszego dzielenia
zagadnienia.
Metodologia dziel i zwyciaj jest bardzo czsto uywana w algorytmach rekurencyjnych,
cho, jak mona si byo przekona na przykadzie wyszukiwania binarnego przedstawionego w rozdziale 2., mona j take zastosowa w algorytmach, ktre nie s rekurencyjne.
Metody dziaajce zgodnie z zasad dziel i zwyciaj zawieraj zazwyczaj dwa rekurencyjne
wywoania samej siebie, z ktrych kade obsuguje poow problemu. W przypadku wyszukiwania
binarnego wystpuj dwa takie wywoania, lecz w rzeczywistoci wykonywane jest tylko jedno z nich
(to, ktre z nich zostanie wykonane, zaley od wartoci klucza). Algorytm sortowania przez scalanie
przedstawiony w dalszej czci rozdziau wykonuje oba rekurencyjne wywoania (kade z nich sortuje poow tablicy).

WIEE HANOI

259

RYSUNEK 6.9.
Rekurencyjna metoda
binarySearch()

Wiee Hanoi
Wiee Hanoi to staroytna zagadka skadajca si z pewnej iloci dyskw umieszczonych na trzech
kolumnach, w sposb przedstawiony na rysunku 6.10.
Wszystkie dyski maj rne rednice oraz otwory na samym rodku, dziki czemu mona je
umieszcza na kolumnach. Pocztkowo wszystkie dyski s umieszczane na kolumnie A. Celem zagadki jest przeniesienie wszystkich dyskw na kolumn C. W kadym ruchu mona przenosi tylko jeden dysk, a dodatkowo aden dysk nie moe by umieszczony na dysku o mniejszej rednicy.

260

6. REKURENCJA

RYSUNEK 6.10.
Wiee Hanoi

Istnieje staroytna legenda twierdzca, e gdzie w Indiach, w niedostpnej wityni, mnisi pracuj dzie i noc, aby przenie 64 zote dyski z jednej wysadzanej diamentami kolumny na drug.
Gdy skocz, ma nastpi koniec wiata. Na szczcie, wszelkie obawy jakie mona poczu po poznaniu tej legendy znikn, gdy okae si, jak wiele czasu zajmuje rozwizanie tej zagadki, nawet dla
znacznie mniejszej iloci dyskw.

Aplet Towers Workshop


Uruchom aplet Towers Workshop. Korzystajc z niego, mona samodzielnie podj prb rozwizania zagadki, przesuwajc myszk najwyszy dysk i umieszczajc go na innej kolumnie. Rysunek 6.11
przedstawia wygld apletu po wykonaniu kilku przesuni.

RYSUNEK 6.11.
Aplet demonstracyjny
Wiee Hanoi

WIEE HANOI

261

Apletu mona uywa na trzy sposoby:


Mona sprbowa samodzielnie rozwiza problem, przecigajc dyski z jednej kolumny na
drug przy uyciu myszki.
Mona klika przycisk Step (Krok), aby obserwowa, jak algorytm rozwizuje zagadk. Podczas wykonywania kadego kroku w oknie apletu jest wywietlany komunikat opisujcy czynnoci wykonywane przez algorytm.
Mona take klikn przycisk Run (Uruchom), aby zobaczy, jak algorytm rozwizuje zagadk
bez adnej interwencji ze strony uytkownika, przesuwajc dyski na poszczeglne kolumny.
Aby ponownie rozpocz zagadk, naley wpisa ilo dyskw, jaka ma zosta uyta, a nastpnie dwukrotnie klikn przycisk New (Nowa) (pierwsze kliknicie powoduje wywietlenie pytania,
czy na pewno naley ponownie rozpocz zagadk). Pocztkowo odpowiednio uoone dyski zostan
umieszczone na kolumnie A. Gdy pierwszy dysk zostanie przecignity myszk na inn kolumn,
przestanie by dostpna moliwo korzystania z przyciskw Step oraz Run. Aby mc z nich skorzysta, konieczne bdzie ponowne rozpoczcie zagadki (z wykorzystaniem przycisku New). Niemniej
jednak nic nie stoi na przeszkodzie, aby rozpocz samodzielne rozwizywanie zagadki podczas krokowego lub w peni automatycznego dziaania algorytmu, bd te, aby przej do trybu w peni automatycznego po wczeniejszym klikaniu przycisku Step lub do trybu krokowego podczas w peni
automatycznego rozwizywania zagadki.
Warto podj prb samodzielnego rozwizania zagadki przy uyciu niewielkiej liczby dyskw,
na przykad trzech lub czterech. Potem mona sprbowa j rozwiza, gdy dyskw bdzie wicej.
Aplet pozwala na intuicyjne poznanie sposobu rozwizywania zagadki Wie Hanoi.

Przesuwanie poddrzew
Zamy, e pocztkowe rozmieszczenie dyskw na kolumnie A, przypominajce ksztatem drzewo
lub piramid, okrelimy mianem drzewa. (Takie drzewa nie maj nic wsplnego z drzewiastymi
strukturami danych, opisywanymi w innych rozdziaach niniejszej ksiki). Bawic si apletem, mona zauway, e podobne, lecz mniejsze drzewa s generowane jako fragmenty procesu rozwizywania zagadki. Te mniejsze drzewa, zawierajce jedynie cz caoci dyskw uywanych z zagadce,
bdziemy nazywa poddrzewami. Na przykad mona zauway, e w przypadku zagadki wykorzystujcej cztery dyski, w jednym z krokw porednich wystpuje poddrzewo skadajce si z 3 dyskw
umieszczonych na kolumnie B (przedstawione na rysunku 6.12).

RYSUNEK 6.12.
Poddrzewo
na kolumnie B

Takie poddrzewa s wielokrotnie tworzone podczas procesu rozwizywania zagadki. Wynika to


z faktu, e utworzenie poddrzewa jest jedynym sposobem przeniesienia wikszego dysku z jednej
kolumny na drug wszystkie mniejsze dyski musz by umieszczane na rodkowej kolumnie,
gdzie w naturalny sposb formuj poddrzewo.

262

6. REKURENCJA

Oto regua, ktra moe pomc w samodzielnym rozwizywaniu zagadki. Jeli poddrzewo, ktre
chcemy przesun, skada si z nieparzystej liczby dyskw, to dysk znajdujcy si na jego wierzchoku mona umieci bezporednio na docelowej kolumnie. Jeli natomiast przesuwane poddrzewo zawiera parzyst ilo dyskw, dysk znajdujcy si na jego wierzchoku naley przesun na rodkow kolumn.

Algorytm rekurencyjny
Rozwizanie problemu Wie Hanoi mona wyrazi w sposb rekurencyjny, wykorzystujc przy tym
notacj poddrzew. Zamy, e chcemy przenie wszystkie dyski z kolumny rdowej (nazwijmy
j Z) na kolumn docelow (oznaczon symbolem D). Dostpna jest kolumna pomocnicza (oznaczana symbolem I). Zakadamy take, e na kolumnie Z znajduje si n dyskw. Oto algorytm:
(1) Przenie poddrzewo skadajce si z n 1 dyskw z kolumny Z na kolumn I.
(2) Przenie ostatni (najwikszy dysk) z kolumny Z na D.
(3) Przenie poddrzewo z kolumny I na D.
Na samym pocztku kolumn rdow jest kolumna A, kolumn pomocnicz kolumna B,
a docelow kolumna C. Na rysunku 6.13 zostay przedstawione trzy kroki ilustrujce ten sposb
rozwizywania problemu Wie Hanoi.
W pierwszej kolejnoci poddrzewo skadajce si z dyskw 1, 2 oraz 3 jest przesuwane na
kolumn B. Nastpnie najwikszy dysk 4 jest przesuwany na kolumn C. W ostatnim kroku
cae poddrzewo jest przesuwane z kolumny B na C.
Oczywicie algorytm ten nie pokazuje, w jaki sposb mona przenie poddrzewo skadajce si
z dyskw 1, 2 oraz 3 na kolumn B, gdy w jednym ruchu nie mona przenie caego poddrzewa
jeden ruch umoliwia przeniesienie tylko jednego dysku. Przeniesienie poddrzewa skadajcego
si z trzech dyskw nie jest zadaniem prostym. Niemniej jednak jest prostsze ni przeniesienie drzewa skadajcego si z czterech dyskw.
Jak si okazuje, przesunicie trzech dyskw z kolumny A na docelow kolumn B take mona
zrealizowa poprzez wykonanie tych samych trzech czynnoci, koniecznych do przeniesienia czterech
dyskw. Te czynnoci to: przeniesienie poddrzewa skadajcego si z dwch pierwszych dyskw
z kolumny A na pomocnicz kolumn C, przeniesienie trzeciego dysku z kolumny A na docelow
kolumn B i w kocu przeniesienie poddrzewa z kolumny C na B.
A w jaki sposb mona przenie poddrzewo skadajce si z dwch dyskw z kolumny A na C?
Ot naley przenie poddrzewo skadajce si z jednego dysku (1) z kolumny A na B. To jest przypadek bazowy: przesuwajc jeden dysk, mona go po prostu zdj z jednej kolumny i umieci na
drugiej nie wymaga to adnych dodatkowych czynnoci. Nastpnie pozostaje przeniesienie wikszego dysku (2) z kolumny A na C i umieszczenie na nim poddrzewa (czyli dysku 1).

Program towers.java
Program towers.java rozwizuje zagadk Wie Hanoi przy uyciu algorytmu rekurencyjnego. Program przedstawia wykonywane czynnoci, wywietlajc stosowne opisy; takie rozwizanie znacznie upraszcza kod programu, ktry w przypadku koniecznoci wywietlania kolumn i dyskw byby znacznie bardziej skomplikowany. Zadaniem uytkownika programu jest odczytanie listy operacji
i samodzielne wykonanie odpowiednich czynnoci.

WIEE HANOI

263

RYSUNEK 6.13.
Rekurencyjne
rozwizanie
problemu
Wie Hanoi

Sam kod programu jest bardzo prosty. Metoda 


zawiera pojedyncze wywoanie metody
 4 
. Z kolei metoda  4 
rekurencyjnie wywouje sama siebie a do momentu rozwizania caego problemu. W tej wersji programu, przedstawionej na listingu 6.4, wykorzystywane
s jedynie trzy dyski; cho oczywicie mona ponownie skompilowa program, tak aby liczba wykorzystywanych dyskw bya inna.
LISTING 6.4.
Program towers.java
  ,-
 $   !0!  !L ) S 
 1.   ' 2 3- 4 1''

% 4 1''

%  C  F

264

6. REKURENCJA

' .% % -   789 


 4  CM T1TM T@TM T3T

#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % -   4    '6M
% %M % M % 


+  '6

7, ,' >C  ! >  %  >  > 





 4   '6"M %M M 
  !  , P/(   '  %%!0
7, ,' >C >   '6   '! 
> ! >  %  >  > 

 4   '6"M M %M 
   
#
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#   %  4 1''


Naley pamita, e trzy dyski s przenoszone z kolumny A na kolumn C. Poniej zostay


przedstawione wyniki wykonania programu:
C  ! 1  3
C G ! 1  @
C  ! 3  @
C F ! 1  3
C  ! @  1
C G ! @  3
C  ! 1  3

Argumentami wywoania metody  4 


s: ilo przenoszonych dyskw, kolumna rdowa (+ ), pomocnicza () oraz docelowa (). Za kadym razem gdy metoda wywouje
sama siebie, ilo dyskw jest zmniejszana o jeden. Zmieniane s take kolumny rdowa, pomocnicza i docelowa.
Poniej zostay przedstawione wyniki wykonania programu zawierajce dodatkowe informacje,
pokazujce, w ktrym miejscu rozpoczyna si wykonywanie metody, jakie s jej argumenty oraz czy
dysk jest przesuwany, poniewa zosta speniony warunek bazowy (poddrzewo zawiera tylko jeden
dysk), czy te dlatego, e jest to najwikszy dysk pozostay po przeniesieniu poddrzewa:
$ %! F 
2 !1M @M 3
$ %! G 
2 !1M 3M @
$ %!  
2 !1M @M 3
$!' .! 2 '!    ! 1  3
& %  

$!     G ! 1  @


$ %!  
2 !3M 1M @
$!' .! 2 '!    ! 3  @
& %  

SORTOWANIE PRZEZ SCALANIE

265

& % G 

$!     F ! 1  3


$ %! G 
2 !@M 1M 3
$ %!  
2 !@M 3M 1
$!' .! 2 '!    ! @  1
& %  

$!     G ! @  3


$ %!  
2 !1M @M 3
$!' .! 2 '!    ! 1  3
& %  

& % G 

& % F 

Przestudiowanie powyszych wynikw oraz kodu rdowego metody  4 


powinno
umoliwi zrozumienie zasady dziaania tej metody. To zadziwiajce, e tak prosty fragment kodu
jest w stanie rozwiza pozornie tak bardzo zoony problem.

Sortowanie przez scalanie


Ostatnim przykadem rekurencji przedstawionym w tym rozdziale bdzie algorytm sortowania przez
scalanie. Jest to algorytm sortujcy, ktrego efektywno jest znacznie wysza od efektywnoci
rozwizania przedstawionego w rozdziale 3., Proste algorytmy sortowania, przynajmniej pod
wzgldem szybkoci dziaania. Algorytm bbelkowy oraz algorytmy bazujce na wstawianiu oraz
selekcji maj zoono rzdu O(N2), natomiast algorytm sortowania przez scalanie zoono O
(N logN). Wykres przedstawiony na rysunku 2.9 (w rozdziale 2.) pokazuje, jak ogromny jest to
wzrost efektywnoci i szybkoci dziaania. Na przykad, jeli N (ilo sortowanych elementw) wynosi 10 000, to N2 wynosi 100 000 000, natomiast N logN jedynie 40 000. A zatem zakadajc, e posortowanie takiej iloci elementw przy uyciu algorytmu mergestort trwa 40 sekund, to
w przypadku algorytmu wstawiania sortowanie zajoby 28 godzin.
Algorytm sortowania przez scalanie jest stosunkowo atwy do zaimplementowania. Pojciowo
jest on znacznie atwiejszy od algorytmw quicksort oraz sortowania Shella, ktre zostan omwione
w nastpnym rozdziale.
Wad tego algorytmu jest konieczno utworzenia w pamici dodatkowej tablicy o takiej samej
wielkoci jak sortowana tablica. A zatem, jeli sortowana tablica zajmuje prawie ca dostpn pami komputera, to algorytm ten nie bdzie nadawa si do wykorzystania. Jeli jednak wolnej pamici jest duo, to jego zastosowanie bdzie dobrym pomysem.

Scalanie dwch posortowanych tablic


Najwaniejsz czci algorytmu sortowania przez scalanie jest scalenie dwch posortowanych tablic. W wyniku scalenia dwch posortowanych tablic A i B powstaje trzecia tablica C, ktra
zawiera posortowane elementy z tablic A i B. W pierwszej kolejnoci zostanie przedstawiony wanie
proces scalania, a dopiero potem sposb wykorzystania tego procesu w sortowaniu.

266

6. REKURENCJA

Wyobramy sobie dwie posortowane tablice. Tablice te nie musz by tej samej wielkoci. Zamy przykadowo, e tablica A zawiera 4 elementy, a tablica B 6 elementw. W wyniku scalenia
zawarto tych tablic zostanie zapisana w tablicy C, ktra pocztkowo skada si z 10 pustych komrek. Tablice te zostay przedstawione na rysunku 6.14.

RYSUNEK 6.14.
Scalanie dwch tablic

Cyfry umieszczone w keczkach widoczne na rysunku 6.14 okrelaj kolejno, w jakiej elementy tablic A i B s zapisywane w tablicy C. W tabeli 6.3 zostay przedstawione porwnania, ktre
naley wykona, aby okreli, jakie elementy maj by skopiowane. Kroki zamieszczone w tabeli
odpowiadaj czynnociom przedstawionym na rysunku. Po kadym porwnaniu mniejszy z elementw jest zapisywany w tablicy C.
TABELA 6.3.
Czynnoci zwizane ze scalaniem tablic
Krok

Porwnanie (jeli jest)

Kopiowanie

1
2
3
4
5
6
7
8
9
10

Porwnujemy liczby 23 oraz 7


Porwnujemy liczby 23 oraz 14
Porwnujemy liczby 23 oraz 39
Porwnujemy liczby 39 oraz 47
Porwnujemy liczby 55 oraz 47
Porwnujemy liczby 55 oraz 81
Porwnujemy liczby 62 oraz 81
Porwnujemy liczby 74 oraz 81

Kopiujemy liczb 7 z tablicy B do C


Kopiujemy liczb 14 z tablicy B do C
Kopiujemy liczb 23 z tablicy A do C
Kopiujemy liczb 39 z tablicy B do C
Kopiujemy liczb 47 z tablicy A do C
Kopiujemy liczb 55 z tablicy B do C
Kopiujemy liczb 62 z tablicy B do C
Kopiujemy liczb 74 z tablicy B do C
Kopiujemy liczb 81 z tablicy A do C
Kopiujemy liczb 95 z tablicy A do C

Warto zwrci uwag, i po wykonaniu kroku 8. tablica B jest pusta, a zatem nie ma potrzeby
wykonywania jakichkolwiek dodatkowych porwna; wszystkie pozostae elementy tablicy A mona po prostu skopiowa do tablicy C.

SORTOWANIE PRZEZ SCALANIE

267

Listing 6.5 przedstawia napisany w Javie program realizujcy operacj scalenia zaprezentowan na rysunku 6.14 oraz w tabeli 6.3. Nie jest to program rekurencyjny jest on jedynie wstpem, ktry pozwoli zrozumie dziaanie algorytmu sortowania przez scalanie.
LISTING 6.5.
Program merge.java
 ,-
 $    0% % /% .  !' %
 ! %  !%,
 1.  %  ' 2 3- U1''

% U1''

' .% % -   789 


89 1  GFM EIM OM *B#
89 @  IM EM F*M BBM HGM IE#
89 3   89
 1M EM @M HM 3

' 3M 

#   %   

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 (0%! .% 1  @ !' 0% % !   .% 3
' .% % -   89 1M  !1M
89 @M  !@M
89 3


 C=M .C=M %C=
 C= K !1 VV .C= K !@
  .%   ' 
+ 18C=9 K @8.C=9

38%C=9  18C=9

38%C=9  @8.C=9
 C= K !1
 .% @ @
 ' M
38%C=9  18C=9   .% 1 1
 
 .C= K !@
 .% 1 1
 ' M
38%C=9  @8.C=9   .% @ @
 
#   

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  .%
' .% % -  ' 89 1M  !


+    K! 

7, ,' 189  > >



7, ,' >>

#

268

6. REKURENCJA

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#   %  U1''


W metodzie 
tworzone s trzy tablice 1, @ oraz 3, nastpnie wywoywana jest metoda 
scalajca tablice 1 i @ i zapisujca ich zawarto w tablicy
3, a w kocu zawarto tablicy 3 jest wywietlana. Oto wyniki wykonania programu:
I E GF F* EI BB HG IE O *B

Wewntrz metody 


umieszczone s trzy ptle . Pierwsza z nich analizuje zawarto
tablicy 1 oraz @, porwnujc ich elementy i zapisujc mniejszy z nich do tablicy 3.
Druga ptla obsuguje sytuacj, w ktrej caa zawarto tablicy @ zostaa zapisana w 3,
natomiast w tablicy 1 wci pozostay elementy do przeniesienia (wanie tak dzieje si w naszym przykadzie, w ktrym w tabeli 1 pozostaj liczby 81 i 95). Ptla ta kopiuje pozostae elementy tablicy 1 i zapisuje je w tablicy 3.
Trzecia ptla while obsuguje podobn sytuacj, gdy wszystkie elementy z tablicy 1 zostay zapisane w 3, lecz w tablicy @ wci pozostaj elementy, ktre naley przenie. Ptla
kopiuje te elementy do tablicy 3.

Sortowanie przez scalanie


Idea dziaania algorytmu sortowania przez scalanie polega na podzieleniu tablicy na dwie czci,
posortowaniu kadej z nich, a nastpnie scaleniu obu posortowanych powek z wykorzystaniem
metody 
z powrotem w jedn tablic. A w jaki sposb s sortowane te powki oryginalnej
tablicy? Niniejszy rozdzia przedstawia zagadnienia rekurencji, a zatem Czytelnik zapewne ju zna
odpowied te powki dzieli si na poowy, ktre nastpnie s sortowane i ponownie scalane.
W podobny sposb wszystkie pary smych czci tablicy s scalane, tworzc posortowane
wiartki, wszystkie pary szesnastych czci tablicy s scalane, tworzc posortowane sme czci
tablicy, i tak dalej. Tablica jest dzielona, a do momentu uzyskania poddrzewa zawierajcego tylko jeden element. To jest przypadek bazowy zakadamy bowiem, e tablica zawierajca jeden
element jest posortowana.
Jak mona si byo przekona, kade rekurencyjne wywoanie metody powoduje zmniejszenie
danych, na jakich operujemy, jednak przed zakoczeniem wywoania dane te s ponownie czone.
W przypadku algorytmu sortowania przez scalanie kade rekurencyjne wywoanie metody powoduje
podzielenie zakresu danych, na jakich operujemy na poow i ponowne scalenie mniejszych zakresw przez zakoczeniem wywoania.
Gdy metoda 7 
koczy dziaanie po dotarciu do dwch jednoelementowych tablic,
elementy te s scalane do postaci posortowanej tablicy dwuelementowej. Wszystkie pary tablicy dwuelementowych s nastpnie scalane do postaci tablicy czteroelementowych. Proces ten jest kontynuowany, a do momentu gdy caa tablica zostanie posortowana. Sposb dziaania algorytmu najatwiej
mona przedstawi, w przypadku gdy ilo elementw w pocztkowej tablicy jest potg liczby 2,
jak pokazano na rysunku 6.15.
W pierwszej kolejnoci na samym dole tablicy zakresy 0-0 oraz 0-1 s scalane do zakresu 0-1.
Oczywicie w rzeczywistoci zakresy 0-0 oraz 1-1 nie s prawdziwymi zakresami s to pojedyncze elementy, speniajce warunek bazowy. Podobnie zakresy 2-2 oraz 3-3 s scalane do zakresu 2-3.
Nastpnie zakresy 0-1 oraz 2-3 s scalane do zakresu 0-3.

SORTOWANIE PRZEZ SCALANIE

269

RYSUNEK 6.15.
Scalanie coraz
wikszych tablic

W grnej powce tablicy zakresy 4-4 i 5-5 s scalane do zakresu 4-5, zakresy 6-6 i 7- 7 do zakresu 6-7, a zakresy 4-5 i 6-7 do zakresu 4-7. W kocu dolna powka tablicy (zakres 0-3) oraz jej
grna powka (zakres 4-7) s czone w pen, posortowan tablic (zakres 0-7).
Jeli natomiast ilo elementw tablicy nie jest potg liczby 2, zachodzi konieczno scalenia
tablic o rnych wielkociach. Na przykad rysunek 6.16 przedstawia sytuacj, w ktrej sortowana
tablica zawiera 12 elementw. W tym przypadku naley scali tablice zawierajc 2 elementy z tablic zawierajc 1 element, uzyskujc w ten sposb tablic trjelementow.

270

6. REKURENCJA

RYSUNEK 6.16.
Scalanie tablic,
ktrych wielko
nie jest potg
liczby 2

W pierwszej kolejnoci jednoelementowy zakres 0-0 jest scalany z jednoelementowym zakresem 1-1, tworzc w ten sposb dwuelementowy zakres 0-1. Nastpnie zakres 0-1 jest scalany z jednoelementowym zakresem 2-2. W ten sposb tworzony jest trjelementowy zakres 0-2. Ten zakres
jest z kolei scalany z trjelementowym zakresem 3-5. Proces ten trwa a do posortowania caej tablicy.

SORTOWANIE PRZEZ SCALANIE

271

Naley zauway, e algorytm sortowania przez scalanie nie scala dwch niezalenych tablic,
zapisujc ich elementy w trzeciej, jak to byo robione w programie merge.java. Zamiast tego scalane s dwa fragmenty tej samej tablicy, w ktrej take s zapisywane wyniki scalenia.
Mona si zastanawia, gdzie s przechowywane wszystkie te podtablice. Algorytm tworzy
w tym celu tablic robocz, ktrej wielko odpowiada wielkoci oryginalnej sortowanej tablicy.
Wszystkie podtablice s przechowywane w odpowiednich miejscach tej tablicy roboczej. Oznacza to,
e podtablice wyznaczone w oryginalnej tablicy s kopiowane w odpowiednie miejsca tablicy roboczej. Po kadym scaleniu zawarto tablicy roboczej jest kopiowana z powrotem do tablicy oryginalnej.

Applet MergeSort Workshop


Opisywany w tej czci rozdziau proces sortowania atwiej doceni, gdy naocznie mona si przekona, w jaki sposb on dziaa. W tym celu uruchom aplet MergeSort Workshop. Klikajc przycisk
Step (Krok), mona wykonywa algorytm krok po kroku. Na rysunku 6.17 zosta przedstawiony stan
algorytmu po wykonaniu trzech pierwszych krokw.

RYSUNEK 6.17.
Aplet demonstracyjny
sortowania przez scalanie

Strzaki lower oraz upper oznaczaj zakres liczb aktualnie analizowany przez algorytm, z kolei
strzaka mid wskazuje rodek rozpatrywanego zakresu. Pocztkowo zakres obejmuje ca sortowan tablic, a nastpnie jest dzielony na poowy za kadym razem, gdy metoda  
wywouje
sama siebie. Gdy rozpatrywany zakres zawiera jeden element, metoda zostaje zakoczona jest
to warunek bazowy algorytmu. W przeciwnym przypadku scalane s dwie podtablice. Aplet wywietla take komunikaty tekstowe, na przykad: Will sort lower half: 0-5, informujc uytkownika
o wykonywanych czynnociach oraz o aktualnie rozpatrywanym zakresie tablicy.
Wiele krokw algorytmu polega na wywoaniu metody  
lub zwracaniu wartoci. Operacje porwnywania oraz kopiowania s wykonywane wycznie podczas procesu scalania, kiedy to
aplet generuje komunikaty o postaci Merged 0-0 and 1-1 into workspace. Samego scalenia nie
mona zaobserwowa, gdy obszar roboczy nie jest prezentowany. Niemniej jednak, po skopiowaniu

272

6. REKURENCJA

odpowiedniego fragmentu obszaru roboczego do oryginalnej tablicy, mona zobaczy wyniki scalenia supki w danym zakresie zostan wywietlone w kolejnoci rosncej.
Na samym pocztku zostan posortowane dwa pierwsze supki, nastpnie pierwsze trzy supki,
potem pierwsze dwa supki zakresu 3-4, trzy supki zakresu 3-5, sze supkw zakresu 0-5, i tak
dalej, zgodnie z sekwencj przedstawion na rysunku 6.16. W kocu wszystkie supki zostan posortowane.
Klikajc przycisk Run (Uruchom), mona zada wykonania caego algorytmu. Proces ten
mona jednak w dowolnej chwili przerwa, klikajc przycisk Step. Po przerwaniu wykonywania algorytmu mona go realizowa krokowo naciskajc przycisk Step jak rwnie wznowi wykonywanie cige klikajc ponownie przycisk Run.
Podobnie jak w innych apletach demonstrujcych algorytmy sortowania, take i w tym kliknicie przycisku New (Nowe) powoduje zapisanie w tablicy nowej grupy nieposortowanych liczb oraz
przecza wypenianie tablicy liczbami losowymi bd liczbami zapisanymi w kolejnoci malejcej.
Przycisk Size (Wielko) umoliwia zmian iloci sortowanych liczb dostpne iloci to 12 oraz 100.
Wyjtkowo pouczajce jest obserwowanie dziaania algorytmu podczas sortowania 100 liczb zapisanych pocztkowo w kolejnoci malejcej. Wywietlane wyniki bardzo wyranie pokazuj, jak
kolejne zakresy s sortowane niezalenie do siebie, a nastpnie scalane, oraz jak zakresy staj si coraz to wiksze.

Program mergeSort.java
W dalszej czci rozdziau zostanie przedstawiony cay program mergeSort.java. W pierwszej kolejnoci przeanalizujemy jednak metod, ktra realizuje algorytm sortowania przez scalanie. Oto jej kod:
'- -  %U7   89  7'%M   @ M
 ''@ 


+  @   ''@ 
  ! !  ,M
        

 !  '    
    @  ''@ 
 G
    0 ' (/L
%U7   7'%M  @ M 

    '0 ' (/L
%U7   7'%M M ''@ 

 % '    ' (/
  7'%M  @ M M ''@ 

#   %  !  
#   %   %U7 

Jak mona si przekona, oprcz przypadku bazowego, kod metody zawiera wycznie cztery
inne instrukcje. Jednak z nich wyznacza punkt rodkowy analizowanego zakresu, dwie kolejne s
rekurencyjnymi wywoaniami metody %U7 
(po jednym dla kadej powki analizowanego zakresu), a ostatni jest wywoanie metody 
scalajcej posortowane powki zakresu. Przypadek bazowy zachodzi, gdy analizowany zakres zawiera tylko jeden element (czyli gdy  @ 
 ''@ ); w takiej sytuacji dziaanie metody zostanie bezzwocznie zakoczone.

SORTOWANIE PRZEZ SCALANIE

273

W programie mergeSort.java uytkownik klasy ma dostp jedynie do metody 7 


. Metoda ta tworzy tablic  7'%89, a nastpnie wywouje rekurencyjn metod %U7 
,
ktra jest odpowiedzialna za faktyczne posortowanie tablicy. Stworzenie tablicy roboczej na potrzeby sortowania jest realizowane w metodzie 7 
. Gdyby tablica ta bya tworzona w metodzie
%U7 
, to kade rekurencyjne wywoanie tej metody powodowaoby ponowne utworzenie
tablicy. Oczywicie byoby to bardzo nieefektywne.
Metoda 
przedstawiona wczeniej w programie merge.java (patrz listing 6.5) operowaa
na trzech oddzielnych tablicach: dwch tablicach rdowych oraz jednej tablicy wynikowej. Metoda

wykorzystana w programie mergeSort.java operuje na jednej tablicy polu 1 klasy
C1. Argumentami wywoania tej metody s liczby okrelajce punkt pocztkowy dolnej poowy
podtabeli, punkt pocztkowy grnej poowy podtabeli oraz punkt kocowy grnej poowy podtabeli.
Na podstawie tych informacji metoda oblicza wielkoci obu fragmentw analizowanego obszaru tabeli.
Peny kod programu mergeSort.java zosta przedstawiony na listingu 6.6. Program ten wykorzystuje klas C1 odmian klasy implementujcej tablice przedstawionej w rozdziale 2., wzbogacon o metody %U7 
oraz 7 
. Metoda 
programu tworzy tablic, zapisuje
w niej 12 elementw, wywietla jej pocztkow zawarto, nastpnie wywouje metod 7 
,
po czym ponownie wywietla zawarto tablicy.
LISTING 6.6
Program mergeSort.java
 7 ,-
 $      %    '!! %
 1.  %  ' 2 3- U7 1''

% C1

'-  89 1   (  .% 1
'-  <    /
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% C1  =
    

1    8=9   ! .%
<  
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% -     - 
 !'   .%

18<9  -    
<      /
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% -  '
  ! % .%

+    K< 
    M
7, ,' 189  > >
   
7, ,' >>

#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% -  7 
  ( '!! 

  ! .!  . %!

274

6. REKURENCJA

 89  7'%    8<9


%U7   7'%M M <"

#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'- -  %U7   89  7'%M   @ M
 ''@ 


+  @   ''@ 
  ! !  ,M
        

 !  '    
    @  ''@ 
 G
    0 ' (/L
%U7   7'%M  @ M 

    '0 ' (/L
%U7   7'%M M ''@ 

 % '    ' (/
  7'%M  @ M M ''@ 

#   %  !  
#   %   %U7 

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'- -    89  7'%M   $M
 $M  ''@ 


      .!  . %!
  @    $
   $"
   ''@ " @     /
  $ K  VV $ K ''@ 

+ 18 $9 K 18$9

 7'%89  18 $9



 7'%89  18$9
  $ K 

 7'%89  18 $9


 $ K ''@ 

 7'%89  18$9
+   K 

18 @ 9   7'%89


#   %   

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#   % % C1

% U7 1''

' .% % -   789 

SORTOWANIE PRZEZ SCALANIE

275

 =7!      .%


C1    (  .%
   C1 =7!
   ! .%L
, HE
   
, G

, FF

, I

, G

, OB

, EE

, F

, **

, 

, O

, FH

,'
   
,7 
     .%L
,'
  '    
#   %   

#   % % U7 1''




Wyniki wykonania tego programu przedstawiaj jedynie nieposortowan oraz posortowan zawarto tablicy:
HE G FF I G OB EE F **  O FH
 F G G FF FH EE HE I OB ** O

Umieszczajc w kodzie metody %U7 


dodatkowe instrukcje, mona by generowa komunikaty informujce o czynnociach, jakie program wykonuje podczas sortowania. Poniszy przykad pokazuje, jak mogyby wyglda takie informacje, generowane podczas sortowania tablicy
zawierajcej 4 liczby HEM GM FFM I# (tablic t mona sobie wyobrazi jako doln powk tablicy z rysunku 6.15).
) ( "F
7   .L!   ' (/ "F
) ( "
7   .L!   ' (/ "
) ( "
$!' .!  " !% "
7   .L! / ' (/ "
) ( "
$!' .!  " !% "
7% ' (/  ! "
D% " 1G HE FF I
7   .L! / ' (/ "F

276

6. REKURENCJA

) ( G"F


7   .L!   ' (/ G"F
) ( G"G
$!' .!  " !% G"G
7   .L! / ' (/ G"F
) ( F"F
$!' .!  " !% F"F
7% ' (/  ! G"F
D% G"F 1G HE FF I
7% ' (/  ! "F
D% "F 1G FF HE I

Mniej wicej te same informacje zwrciby aplet demostracyjny MergeSort, gdyby by w stanie sortowa jedynie cztery elementy. Analiza powyszych wynikw oraz porwnanie ich z kodem
metody %U7 
i rysunkiem 6.15 umoliwi dokadne zrozumienie zasady dziaania omawianego algorytmu sortowania.

Efektywno dziaania algorytmu sortowania przez scalanie


Zgodnie z podanymi wczeniej informacjami, efektywno dziaania algorytmu sortowania przez
scalanie wynosi O(N logN). Ale skd to wiadomo? Przekonajmy si, w jaki sposb mona okreli,
ile razy podczas dziaania algorytmu dane bd musiay zosta skopiowane oraz ile razy trzeba je
bdzie porwnywa. Zakadamy, e wanie kopiowanie danych oraz ich porwnywanie s operacjami zajmujcymi najwicej czasu oraz e rekurencyjne wywoania metod i zwracanie wartoci przez
metod nie powoduje znaczcych narzutw czasowych.

Ilo kopiowa
Przeanalizujmy rysunek 6.15. Kada komrka umieszczona poniej grnego wiersza liczb reprezentuje dan skopiowan z tablicy do obszaru roboczego.
Dodajc do siebie ilo wszystkich komrek widocznych na rysunku 6.15 (w siedmiu ponumerowanych etapach), mona si przekona, e posortowanie 8 elementw wymaga wykonania 24 operacji kopiowania. Log28 ma warto 3, a zatem 8 log28 daje 24. Wynika std, e dla tablicy zawierajcej 8 elementw, ilo operacji kopiowania jest proporcjonalna do wartoci N log2N.
Na analizowany proces sortowania mona jednak spojrze w inny sposb. Ot posortowanie
8 liczb wymaga 3 poziomw, a kady z nich skada si z 8 operacji kopiowania. Poziom oznacza
w tym przypadku wszystkie operacje kopiowania do podtablicy o takiej samej wielkoci. Na pierwszym poziomie wykorzystywane s cztery podtablice 2-elementowe, na drugim poziomie dwie
podtablice 4-elementowe, a na trzecim poziomie jednak podtablica 8-elementowa. Kady poziom
zawiera 8 elementw. A zatem take przy takim podejciu wykonywanych jest 3 8, czyli 24 operacje
kopiowania.
Analizujc fragmenty rysunku 6.15, mona si przekona, e do posortowania 4 elementw koniecznych jest 8 operacji kopiowania (etapy 1, 2 oraz 3), a do posortowania 2 elementw dwie
operacje kopiowania. Identyczne obliczenia pozwalaj okreli ilo operacji kopiowania, jakie naley wykona w celu posortowania wikszych tablic. Podsumowanie tych informacji zostao przedstawione w tabeli 6.4.

277

SORTOWANIE PRZEZ SCALANIE

TABELA 6.4.
Ilo operacji wykonywanych w przypadku gdy N jest potg liczby 2
N

log2N

Ilo operacji kopiowania


do obszaru roboczego

czna ilo operacji


kopiowania

Ilo porwna Maksimum


(minimum)

2
4
8
16
32
64
128

1
2
3
4
5
6
7

2
8
24
64
160
384
896

4
16
48
128
320
768
1792

1 (1)
5 (4)
17 (12)
49 (32)
129 (80)
321 (192)
769 (448)

W rzeczywistoci sortowane liczby nie s kopiowane jedynie do obszaru roboczego, lecz take z powrotem do oryginalnej tablicy. Oznacza to, e ilo operacji kopiowania jest dwukrotnie
wiksza, co zostao odzwierciedlone w kolumnie czna ilo operacji kopiowania. Ostatnia kolumna tabeli 6.4 zawiera informacje dotyczce iloci porwna; to zagadnienie zostanie opisane
w dalszej czci rozdziau.
Nieco trudniej jest obliczy ilo operacji kopiowania oraz ilo porwna w przypadku gdy N
nie jest wielokrotnoci liczby 2. Wyniki uzyskiwane w tych przypadkach mieszcz si w granicach
uzyskiwanych dla liczb stanowicych potgi liczby 2. Na przykad dla 12 elementw koniecznych
jest 88 operacji kopiowania, a dla 100 elementw 1344 operacje kopiowania.

Ilo porwna
W przypadku algorytmu sortowania przez scalanie ilo porwna, jakie naley wykona w celu posortowania tablicy, zawsze jest nieco mniejsza od iloci koniecznych operacji kopiowania. O ile mniejsza? Zakadajc, e ilo sortowanych elementw jest wielokrotnoci liczby 2, dla kadej niezalenej operacji scalania maksymalna ilo porwna jest zawsze o jeden mniejsza od iloci scalanych
elementw. Z kolei minimalna ilo porwna odpowiada poowie iloci scalanych elementw.
O prawdziwoci tych oblicze mona si przekona, analizujc rysunek 6.18, przedstawiajcy dwie
sytuacje, jakie mog zaj podczas scalania dwch 4-elementowych tablic.
W pierwszym przypadku elementy s rozmieszczone naprzemiennie, a do scalenia tablic naley wykona siedem porwna. W drugim przypadku wszystkie elementy pierwszej tablicy s
mniejsze od wszystkich elementw drugiej tablicy, a zatem do scalenia obu tablic konieczne bd
tylko cztery porwnania.
Podczas kadego sortowania wykonywanych jest wiele operacji scalania, a zatem naley zsumowa iloci porwna wykonywanych w ramach poszczeglnych operacji scalania. Odwoujc si
ponownie do rysunku 6.15, mona si przekona, e posortowanie omiu elementw wymaga wykonania siedmiu operacji scalania. Iloci scalanych elementw oraz odpowiadajce im iloci porwna zostay przedstawione w tabeli 6.5.
Maksymalna ilo porwna, jakie naley wykona podczas kadej operacji scalania, jest o jeden mniejsza od iloci scalanych elementw. Po dodaniu odpowiednich liczb dla wszystkich wykonywanych operacji scalania okazuje si, e maksymalna ilo porwna wynosi 17.
Z kolei minimalna ilo porwna zawsze jest o poow mniejsza od iloci scalanych elementw, co, po zsumowaniu wszystkich operacji scalania, daje w rezultacie wynik 12. W taki sam sposb zostay wyznaczone wyniki podane w kolumnie Ilo porwna tabeli 6.4. Faktyczna ilo
porwna, jakie naley wykona w celu posortowania konkretnej tablicy, zaley od kolejnoci, w jakiej s zapisane jej elementy; niemniej jednak zawsze bdzie to liczba leca pomidzy przedstawion
powyej wartoci minimaln i maksymaln.

278

6. REKURENCJA

RYSUNEK 6.18.
Maksymalna
i minimalna
ilo porwna
TABELA 6.5.
Porwnania wykonywane podczas sortowania 8 elementw
Numer kroku

Ilo sumaryczna

Ilo scalanych
elementw (N)
Maksymalna ilo
porwna (N 1)
Minimalna ilo
porwna (N / 2)

24

17

12

Eliminacja rekurencji
Niektre algorytmy mona zaimplementowa w sposb rekurencyjny, a inne nie. Jak mona si byo
przekona, rekurencyjne metody 
oraz +% 
mona zaimplementowa przy uyciu
ptli, a co wicej, rozwizanie takie bdzie bardziej efektywne ni uycie rekurencji. Niemniej jednak, wiele algorytmw dziaajcych wedug zasady dziel i zwyciaj, takich jak na przykad sortowanie przez scalanie, dziaa bardzo dobrze, wykorzystujc wanie rekurencj.
Czsto zdarza si, e algorytm mona atwo wyobrazi sobie jako metod rekurencyjn, jednak
po jego implementacji okazuje si, e takie rozwizanie jest mao efektywne. W takich przypadkach
warto przeksztaci algorytm rekurencyjny na odpowiadajcy mu algorytm, ktry nie wykorzystuje
rekurencji. Takie przeksztacenie algorytmu rekurencyjnego czsto moe bazowa na wykorzystaniu stosu.

ELIMINACJA REKURENCJI

279

Rekurencja i stosy
Istnieje bardzo bliski zwizek pomidzy rekurencj i stosami. W rzeczywistoci przewaajca wikszo kompilatorw implementuje mechanizmy rekurencyjne wanie w oparciu o stosy. Zgodnie
z informacjami podanymi wczeniej, w momencie wywoywania metody kompilator zapisuje na stosie argumenty przekazywane do metody oraz adres powrotu (okrelajcy miejsce, gdzie zostanie przekazane sterowanie po jej zakoczeniu), po czym przekazuje sterowanie do metody. Gdy metoda koczy
dziaanie, informacje zapisane na stosie przed jej uruchomieniem zostaj ze stosu usunite. Argumenty metody znikaj, a sterowanie jest przekazywane pod wskazany adres powrotu.

Symulowanie metod rekurencyjnych


W tej czci rozdziau zostanie przedstawiona metoda przeksztacania metod rekurencyjnych na metody bazujce na wykorzystaniu stosu. Czy Czytelnik pamita rekurencyjn metod 
przedstawion w pierwszej czci tego rozdziau? Oto jej kod:
   


+ 

  

     "


#

Algorytm ten zostanie teraz podzielony na poszczeglne czynnoci, z ktrych kada bdzie reprezentowana przez osobn klauzul % w instrukcji % (podobnego podziau metody mona
take dokona, stosujc instrukcj   dostpn w C++ oraz innych jzykach programowania, jednak w Javie instrukcja ta nie istnieje).
Instrukcja % zostaa umieszczona w metodzie o nazwie '
. Kade wywoanie tej metody powoduje wykonanie jednej z klauzul % umieszczonych w instrukcji %. Cykliczne wywoywanie metody '
spowoduje w kocu wykonanie wszystkich operacji algorytmu.
Przedstawiona powyej metoda 
wykonuje dwa rodzaje operacji. Pierwsz z nich
jest wykonanie oblicze arytmetycznych koniecznych do wyznaczenia wartoci liczby trjktnej. Wymaga ona sprawdzenia, czy warto  jest rwna  oraz dodanie  do wartoci zwrconej przez rekurencyjne wywoanie metody. Niemniej jednak metoda 
wykonuje take inne operacje,
konieczne do jej poprawnego wykonania; mona do nich zaliczy przekazywanie sterowania, pobieranie argumentw oraz zwracanie wartoci wynikowej. Operacji tych nie mona zauway, analizujc kod metody, jednak wystpuj one we wszystkich tworzonych metodach. Poniej zostay oglnie
opisane czynnoci wykonywane podczas wywoywania metody:
W momencie wywoywania metody jej argumenty oraz adres powrotu s zapisywane na stosie.
Metoda moe uzyska dostp do argumentw, pobierajc je z wierzchoka stosu.
Bezporednio przed zakoczeniem dziaania metody ze stosu pobierany jest adres powrotu,
a nastpnie zarwno ten adres, jak i argumenty wywoania metody s usuwane ze stosu.

280

6. REKURENCJA

Program stackTriangle.java zawiera trzy klasy: $, 7%W oraz 7%41''. Klasa
$ reprezentuje adres powrotu oraz argument wywoania metody ; obiekty tej klasy s zapisywane na stosie. Klasa 7%W przypomina klasy implementujce stosu przedstawione w innych rozdziaach tej ksiki; wyrnia j jedynie to, i umoliwia operowanie na obiektach klasy $.
Klasa 7%41'' zawiera cztery metody: 
, %4
, '
oraz znan ju metod :
suc do pobierania danych liczbowych.
Metoda 
prosi uytkownika o podanie liczby, nastpnie wywouje metod %4

(ktrej zadaniem jest wyznaczenie liczby trjktnej odpowiadajcej liczbie podanej w wywoaniu),
a w kocu wywietla wyniki.
Metoda %4
tworzy obiekt 7%W i przypisuje waciwoci % $ warto . Pozosta czci metody jest ptla , ktra cyklicznie wywouje metod '
. Ptla ta zostanie
zakoczona dopiero w momencie, gdy metoda '
zwrci warto  , co nastpi w przypadku
wykonania szstej klauzuli % czyli punktu zakoczenia metody. Metoda '
jest w zasadzie du instrukcj %, ktrej klauzule % odpowiadaj fragmentom kodu oryginalnej metody

. Kod programu stackTriangle.java zosta przedstawiony na listingu 6.7.
LISTING 6.7.
Program stackTriangle.java
 %4,-
 $  !%! %!. /0M !L' 0%  %L  
 1.  %  ' 2 3- 7%41''
'  -, ,5  +  :;

% $  ' !'   

' .%  
' .%   1
' .% $  M  



 1
#
#   %  $

% 7%W

'-  =7!    .% 7%W
'- $89 %1
'-   '  !% (  
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% 7%W  
    

=7!       .%
%1   $8=7!9   ! .%L
 '  "   ! .%  ' 
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% -  '  $ '
 !%!   !% (  

ELIMINACJA REKURENCJI

281

%18 '9  '     !% (M  
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% $ ' '
 ' .  ! !% (  

  %18 '""9  ' . M    !% (
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% $ '
 %!  ! !% (  
 .!   
  %18 '9
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#   %  7%W

% 7%41''

%  6 .
%  1
% 7%W 7%
%  % $
% $ $
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % -   789 
  :;<=%' 

7, ,' >$  %!.2 >

6 .  :

%4

7, ,' >;' %  %!.  >1

#   

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % -  %4


7%   7%W 

% $  
 '
 +
  (  '
  !/%  
   % ' 
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % .  '


% % $


% 2   ( ' %!0 
$   $ 6 .M H

7%,'  $

% $  G
.
% G2  >%>   
$  7%,'

+ $,  
 '!  

282

6. REKURENCJA

1  
% $  B   %
#

% $  F   (  %
.
% F2   (  
$ $   $ $, " M E

7%,'  $

% $  G  %   
.
% E2  .%!
$  7%,'

1  1  $,
% $  B
.
% B2  % !  
$  7%,'

% $  $, 1  E  . H

7%,' '

.
% H2  ! J%! !(  
   
#   %  % %
  +
#   %   
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % 7 7
  :;<=%' 

:' 7?    :' 7? 7,

@ ++? .   @ ++? 

7   .,A

  
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% %  :
  :;<=%' 

7   7

  :,': 

#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#   %  7%41''


Powyszy program wyznacza warto liczb trjktnych, podobnie jak program triangle.java
przedstawiony na pocztku tego rozdziau (na listingu 6.1). Oto przykadowe wyniki jego wykonania:
$  %!. 
;' %  %!.  BB

Rysunek 6.19 przedstawia relacj pomidzy poszczeglnymi klauzulami % oraz fragmentami algorytmu.

ELIMINACJA REKURENCJI

283

RYSUNEK 6.19.
Klauzule case oraz
metoda step()

Cho cay przedstawiany program symuluje jedn metod, nie nosi adnej nazwy, gdy w rzeczywistoci nie jest on prawdziw metod. Tej symulowanej metodzie nadamy umown nazw "
U
. Jej pocztkowe wywoanie (w klauzuli % ) zapisuje na stosie warto podan przez uytkownika oraz warto wynikow 6, po czym przechodzi do punktu pocztkowego (klauzula % G).
W punkcie pocztkowym (klauzula % G) metoda U
sprawdza, czy przekazany argument ma warto 1. W tym celu odczytywana jest warto elementu znajdujcego si na wierzchoku
stosu (bez jego usuwania). Jeli argument ma warto 1, zachodzi przypadek bazowy i sterowanie
przekazywane jest do punktu kocowego (klauzula % B). W przeciwnym wypadku, czyli gdy warto przekazanego argumentu jest rna od 1, metoda rekurencyjnie wywouje sama siebie (klauzula
% F). To rekurencyjne wywoanie polega na umieszczeniu na stosie wartoci  "  i adresu
powrotu wynoszcego 4 oraz przejcia do punktu pocztkowego metody (klauzula % G).
Podczas zakaczania rekurencyjnego wywoania metody metoda U
dodaje argument 
do wartoci zwrconej przez wywoanie rekurencyjne. W kocu rekurencyjne wywoanie metody

284

6. REKURENCJA

zostanie zakoczone (klauzula % B). W tym momencie ze stosu jest usuwany obiekt $ umieszczony na jego wierzchoku; obiekt ten nie jest ju do niczego potrzebny.
Adres powrotu, podany w pocztkowym wywoaniu, mia warto 6. A zatem, w momencie
zakaczania dziaania metody U
, sterowanie jest przekazywane do klauzuli % H. Umieszczony w niej kod zwraca warto  , co powoduje zakoczenie ptli  w metodzie %"
4
.
Warto zwrci uwag, i w powyszym opisie metody U
uywane s takie zwroty jak:
argument, wywoanie rekurencyjne oraz adres powrotu. Naley pamita, e w tym kontekcie opisuj
one jedynie symulowane cechy, a nie faktyczne informacje i operacje wykonywane przez program.
Gdyby w poszczeglnych klauzulach % zostay umieszczone instrukcje wywietlajce informacje o czynnociach wykonywanych przez metod U
, to wygenerowane wyniki mogyby
przypomina te przedstawione poniej:
$  %!.2
% , 1 7 2
% G, 1 7 2 EM H

% F, 1 7 2 EM H

% G, 1 7 2 EM H
FM E

% F, 1 7 2 EM H
FM E

% G, 1 7 2 EM H
FM E
GM E

% F, 1 7 2 EM H
FM E
GM E

% G, 1 7 2 EM H
FM E
GM E
M E

% B, 1 7 2 EM H
FM E
GM E
M E

% E, 1 7 2 EM H
FM E
GM E

% B, 1F 7 2 EM H
FM E
GM E

% E, 1F 7 2 EM H
FM E

% B, 1H 7 2 EM H
FM E

% E, 1H 7 2 EM H

% B, 1 7 2 EM H

% H, 1 7 2
;' %  %!.  

Cyfra wywietlana przy sowie case okrela aktualnie wykonywany fragment kodu. Wywietlana jest take zawarto stosu (skadajca si z obiektw $ zawierajcych argument  oraz
adres powrotu). Metoda U
jest rozpoczynana i zakaczana cztery razy (czemu odpowiadaj
klauzule % G oraz % B). Dopiero w momencie zakaczania tej metody obliczone wyniki zostaj
zapisywane w zmiennej 1.

Czego to dowodzi?
Program stackTriangle.java przedstawiony na listingu 6.7 jest przykadem programu, ktry, w sposb mniej lub bardziej systematyczny, przeksztaca algorytm rekurencyjny w rozwizanie wykorzystujce stos. Sugeruje to, e w podobny sposb mona przeksztaci dowolny program wykorzystujcy rekurencj. I faktycznie jest to moliwe.
Wkadajc nieco dodatkowej pracy, mona systematycznie zmodyfikowa przedstawiony program w celu poprawienia efektywnoci jego dziaania. Modyfikacje te mog nawet doprowadzi do
cakowitego zlikwidowania instrukcji %.

ELIMINACJA REKURENCJI

285

W rzeczywistoci znacznie bardziej praktycznym rozwizaniem jest przemylenie i zaimplementowanie algorytmu od podstaw, z wykorzystaniem stosu, a nie rekurencji. Listing 6.8 pokazuje
jak w takim przypadku moe si zmieni kod metody 
.
LISTING 6.8.
Program stackTriangle2.java
 %4G,-
 $  !%! %!. /0M  ! 0%  M    %L
 1.  %  ' 2 3- 7%4G1''
'  -, ,5   %!  '% %%

% 7%W

'-  =7!    .%  
'- 89 %1
'-   '  !% (  
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% 7%W  
    

=7!  
%1   8=7!9
 '  "
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% -  '   '
 !%!   !% (  
%18 '9  ' #
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%  ' '
 ' .  ! !% (  
  %18 '""9 #
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%  '
 %!  %  ! !% (
  %18 '9 #
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% .  <'
       ' 
   '  "
 #
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#   %  7%W

% 7%4G1''

%  6 .
%  1
% 7%W 7%
' .% % -   789 
  :;<=%' 

7, ,' >$  %!.2 >

7, ,+ 

6 .  :

%4

7, ,' >;' %  %!.  >1

#   

286

6. REKURENCJA

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % -  %4


7%   7%W 
   !  
1    %!%  %  
 6 .  
         

7%,'  6 .
  !'   
""6 .  % %!.
#
 R7%,<'

         ' M

 6  7%,' '
  ' .  %M
1  6     %  ' !
#
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% % 7 7
  :;<=%' 

:' 7?    :' 7? 7,

@ ++? .   @ ++? 

7   .,A

  
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .% %  :
  :;<=%' 

7   7

  :,': 

#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#   %  7%4G1''


W metodzie %4
zostay umieszczone dwie krtkie ptle , zastpujce ca
metod '
wykorzystywan w programie stackTriangle.java. Oczywicie, analizujc ten program, mona si przekona, e istnieje moliwo rezygnacji z wykorzystania stosu i sprowadzenia
caego programu do prostej ptli . Niemniej jednak, w bardziej zoonych algorytmach stos
musi by wykorzystywany.
Bardzo czsto naley przeprowadza eksperymenty, aby przekona si, ktre z rozwiza rekurencyjne, wykorzystujce stos, czy te bazujce na prostej ptli jest najbardziej efektywne
w danej sytuacji.

Niektre interesujce zastosowania rekurencji


W tej czci rozdziau zostan pokrtce przedstawione niektre inne, interesujce zastosowania rekurencji. Wziwszy pod uwag rnorodno przedstawionych tu przykadw, mona doj do wniosku,
e rozwizania rekurencyjne mog si przydawa w wielu niespodziewanych sytuacjach. W tej czci

NIEKTRE INTERESUJCE ZASTOSOWANIA REKURENCJI

287

rozdziau zostan przeanalizowane trzy zagadnienia: podnoszenie liczby do potgi, rozwizanie problemu plecakowego oraz wybieranie czonkw ekspedycji alpinistycznej. We wszystkich tych przypadkach zostan przedstawione wycznie oglne pojcia zwizane z danym zagadnieniem, natomiast
implementacja programu bdzie stanowi wiczenie, ktre Czytelnik moe wykona we wasnym
zakresie.

Podnoszenie liczby do potgi


Bardziej zaawansowane kalkulatory kieszonkowe pozwalaj na podnoszenie liczb do dowolnej potgi. Zazwyczaj na klawiaturze takich kalkulatorw mona znale przycisk x^y, gdzie znak X oznacza, e liczba x jest podnoszona do potgi y. W jaki sposb mona wykona potgowanie, w przypadku gdy kalkulator nie bdzie dysponowa odpowiednim przyciskiem? Mona przyj, e podniesienie
liczby z do potgi y wymaga pomnoenia liczby x przez siebie sam y razy. A zatem, jeli x wynosi 2, a y wynosi 8 (28), to wymagane byoby wykonanie nastpujcego dziaania: 2 2 2 2
2 2 2 2. Niemniej jednak w przypadkach, gdy warto y jest bardzo dua, rozwizanie to moe si okaza mczce. Czy istnieje zatem jaki lepszy sposb?
Jednym z moliwych rozwiza jest zmiana podejcia do problemu i mnoenie przez siebie
iloczynw liczby 2, a nie uzyskanego wyniku razy 2. Rozpatrzmy przykad podnoszenia liczby 2 do
potgi 8 (28). W tym przypadku konieczne jest pomnoenie przez siebie omiu liczb 2. Zamy, e
zaczynamy od dziaania 2 2 = 4. Jego wykonanie spowoduje, e dwie liczby 2 zostan ju wykorzystane, pozostaje jednak kolejnych 6 liczb. Jednak w tym momencie pojawia si nowa warto,
ktra bierze udzia w dziaaniu jest ni warto 4. Mona zatem sprbowa pomnoy 4 4, co
daje 16 i wykorzystuje ju 4 liczby 2 (poniewa kada liczba 4 to dwie pomnoone przez siebie
liczby 2). A zatem naley wykorzysta jeszcze cztery liczby 2, jednak w tym momencie mona ju
operowa na wartoci 16, a mnoenie 16 16 wykorzystuje dokadnie osiem liczb 2 (gdy kada liczba 16 to cztery pomnoone liczby 2).
A zatem udao si okreli warto 28, wykonujc jedynie trzy mnoenia, a nie siedem. Oznacza to, e zoono takiego algorytmu wynosi O(log N), a nie O(N).
Czy mona zaimplementowa ten proces w formie algorytmu, nadajcego si do wykonywania na komputerze? Schemat jego dziaania opiera si na rwnaniu xy = (x2)y / 2. W przedstawionym
przykadzie 28 = (22)8 / 2, czyli 28 = (22)4. Rwnanie to jest poprawne, gdy potgowanie potgi daje te
same wyniki co pomnoenie wykadnikw.
Zakadamy jednak, e nasz komputer nie jest w stanie podnosi liczb do potgi, a zatem nie
moemy obliczy wartoci (22)4. Sprawdmy zatem, czy mona przeksztaci to wyraenie do postaci wykorzystujcej wycznie mnoenie. Sztuczka polega na tym, aby rozpocz obliczenia od zastpienia wartoci 22 now zmienn.
Zamy, e 22 = a. W takim przypadku 28 wynosi (22)4 czyli a4. Niemniej jednak, bazujc na
pocztkowym rwnaniu, a4 mona zapisa jako (a2)2; a zatem 28 = (a2)2.
Ponownie wykorzystujemy now zmienn c zastpujc ni a2. Tym razem (c)2 mona
zapisa jako (c2)1. Take i to wyraenie jest rwne 28.
W ten sposb uzyskalimy problem, ktry mona rozwiza, wykorzystujc wycznie mnoenie wystarczy pomnoy c razy c.
Ten schemat postpowania mona zaimplementowa w postaci metody rekurencyjnej pozwalajcej na wyznaczanie potg. Metodzie tej mona, na przykad, nada nazw ' 
. Argumentami wywoania tej metody s liczby x oraz y, a metoda zwraca warto xy. Zmiennymi pomocniczymi, takimi jak a oraz c nie trzeba si przejmowa, gdy podczas kadego rekurencyjnego wywoania

288

6. REKURENCJA

metody, argumentom x oraz y s przypisywane nowe wartoci. Konkretnie rzecz biorc, argumentowi x przypisywana jest warto x x, a argumentowi y warto y / 2. Poniej zostaa przedstawiona sekwencja argumentw i zwracanych wartoci dla argumentw pocztkowych wynoszcych
odpowiednio x = 2 oraz y = 8:
=GM O
=EM E
=HM G
=GBHM 
) GBHM =GBHM 
) GBHM =HM G
) GBHM =EM E
) GBHM =GM O

Metoda zwraca warto wynikow w momencie, gdy argument y uzyska warto 1. Gdy to nastpi, warto wynikowa jest przekazywana bez adnych modyfikacji a na sam pocztek sekwencji
wywoa metody.
Przedstawiony przykad zakada, e warto y zawsze jest parzysta (nawet po kolejnych dzieleniach). Jednak nie jest to jedyny moliwy przypadek. Poniej pokazano, w jaki sposb mona zmodyfikowa algorytm, tak aby obsugiwa take nieparzyste wartoci wykadnika (y). Realizujc kolejne rekurencyjne wywoania metody, naley uywa dzielenia cakowitego lub pomija wszelkie
uamki, ktre mog wystpi podczas dzielenia wartoci y przez 2. Natomiast pniej, podczas procesu koczenia kolejnych rekurencyjnych wywoa metody, w przypadku gdy warto y jest nieparzysta, zwrcony wynik naley dodatkowo pomnoy razy x. Oto sekwencja wywoa realizowana podczas wyznaczania wartoci 318:
=FM O
=*M *
=OM E
=HBHM G
=EFEHIGM 
) EFEHIGM =EFEHIGM 
) EFEHIGM =HBHM G
) EFEHIGM =OM E
) FOIEGEO*M =*M *    '!M L%    ! =
) FOIEGEO*M =FM O

Problem plecakowy
Jest to klasyczny problem informatyczny. W najprostszej postaci polega on na podejmowaniu prb
umieszczenia w plecaku elementw o rnej wadze, tak aby sumaryczna waga plecaka osigna pewn okrelon warto. Nie ma wymogu, by w plecaku zostay umieszczone wszystkie elementy.
Na przykad, zamy, e sumaryczna waga plecaka ma wynosi 20 kilogramw, a do dyspozycji mamy elementy o wagach 11, 8, 7, 6 oraz 5 kilogramw. W przypadku niewielkiej iloci elementw, ludzie cakiem dobrze radz sobie z rozwizywaniem tego problemu, sprawdzajc kolejne
moliwoci. Dlatego Czytelnik zapewne nie bdzie mie wikszych problemw z okreleniem, e
zamierzon warto 20 mona uzyska dodajc liczby 8, 7 oraz 5.

NIEKTRE INTERESUJCE ZASTOSOWANIA REKURENCJI

289

Jednak, aby to komputer rozwiza ten problem, konieczne bdzie podanie mu bardziej szczegowych instrukcji. Poniej zosta przedstawiony algorytm rozwizania:
(1) Jeli w jakimkolwiek momencie realizacji procesu suma wag wybranych elementw zrwna
si z wag docelow, naley zakoczy dziaanie.
(2) Pocztkowo wybierany jest pierwszy element. Wagi pozostaych elementw musz zrwna
si z wag docelow, pomniejszon o wag pierwszego wybranego elementu. Jest to nowa waga docelowa.
(3) Kolejno naley wyprbowa wszystkie dostpne kombinacje pozostaych elementw. Naley
jednak zauway, e w rzeczywistoci wcale nie trzeba sprawdza wszystkich kombinacji,
gdy sumowanie mona zakoczy w momencie, gdy sumaryczna waga wybranych elementw
przekracza wag docelow.
(4) Jeli nie uda si odnale kombinacji elementw o zadanej wadze, to naley odrzuci pierwszy
element i rozpocz cay proces od pocztku, wybierajc element kolejny.
(5) W podobny sposb naley rozpocz cay proces sprawdzania, wybierajc na pocztku trzeci,
czwarty oraz kolejne elementy, a do momentu przeanalizowania caego zbioru dostpnych elementw. Sprawdzenie wszystkich moliwoci bdzie oznacza, e poszukiwane rozwizanie
nie istnieje.
W przedstawionym powyej przykadzie rozpocznijmy od wybrania elementu o wadze 11. Teraz
suma wag pozostaych elementw ma wynosi 9 (20 minus 11). Spord dostpnych elementw
wybieramy ten o wadze 8. Sumaryczna waga wybranych elementw jest jednak mniejsza od wagi docelowej. Wyznaczamy zatem now wag docelow, wynoszc 1 (9 minus 8). Wybieramy element
o wadze 7, lecz jest on zbyt ciki, wic sprawdzamy pozostae elementy o wagach 6 i 5, jednak
take one s zbyt cikie. W tym momencie zbir dostpnych elementw zosta wyczerpany, a zatem
wiadomo, e nie istnieje kombinacja zawierajca element o wadze 8, ktrej waga sumaryczna bdzie
wynosi 9. Nastpnie wybieramy element o wadze 7, a zatem poszukiwana nowa waga docelowa wynosi 2 (9 minus 7). Na tej samej zasadzie wykonywane s kolejne czynnoci przedstawione poniej:
<2 M OM I M HM B

  )  %   GM   !. (
M O  )  %   *M O  !. (
M OM I  )  %   M I  !.  
M OM H  )  %   M H  !.  
M OM B  )  %   M B  !.   , @ /
M I  )  %   *M I  !. (
M IM H  )  %   GM H  !.  
M IM B  )  %   GM B  !.   , @ /
M H  )  %   *M H  !. (
M HM B  )  %   FM B  !.   , @ /
M B  )  %   *M B  !. ( , @ /
O  )  %   GM O  !. (
OM I  )  %   GM I  !. (
OM IM H  )  %   BM H  !.  
OM IM B  )  %   BM B ' R Y( LR

Jak mona si domyli, rekurencyjna metoda mogaby wybra pierwszy element ze zbioru dostpnych elementw, a nastpnie, jeli jego waga jest mniejsza od sumarycznej wagi docelowej, wywoa sam siebie, by sprawdzi sum wag pozostaych dostpnych elementw.

290

6. REKURENCJA

Kombinacje: Wybieranie zespou


W matematyce kombinacja jest wybran grup elementw, ktrych kolejno nie ma znaczenia. Na
przykad, zamy, e istnieje grupa piciu alpinistw oznaczonych jako A, B, C, D oraz E. Spord
nich trzeba wybra grup trzech, ktrzy zdobd strom i oblodzon gr Mount Anaconda. Niemniej
jednak zachodz obawy, jak poszczeglni czonkowie ekipy bd ze sob wsppracowa i z tego
wzgldu zdecydowalimy si sporzdzi list wszystkich moliwych zespow (czyli wszystkie moliwe kombinacje trzech alpinistw). Wkrtce jednak zmienilimy decyzj i teraz chcemy, aby to program komputerowy wygenerowa za nas list zespow. Taki program wywietliby list 10 moliwych kombinacji:
1@3M 1@CM 1@<M 13CM 13<M 1C<M @3CM @3<M @C<M 3C<

W jaki sposb mona by napisa taki program? Okazuje si, e istnieje eleganckie, rekurencyjne rozwizanie tego problemu. Wie si ono z podzieleniem wszystkich kombinacji na dwie grupy: tych ktre rozpoczynaj si od alpinisty A, oraz wszystkich pozostaych. Zamy, e zadanie
wybrania druyny trzech osb spord grupy picioosobowej zapiszemy skrtowo (5, 3). Nastpnie
zamy, e wielko grupy oznaczymy przez n, a ilo osb w zespole przez k. W takim przypadku nasze twierdzenie ma posta:
(n, k) = (n 1, k 1) + (n 1, k)
W przedstawionym przykadzie, wymagajcym wybrania trzech osb spord piciu, uzyskujemy:
(5, 3) = (4, 2) + (4, 3)
W ten sposb wikszy problem zosta podzielony na dwa mniejsze. Zamiast wybierania spord grupy piciu osb, przeprowadzane s dwie operacje wyboru z grupy czterech osb. Pierwsza z nich
sprowadza si do wyznaczenia wszystkich sposobw wybrania dwch osb spord czterech, a druga do wyznaczenia wszystkich sposobw wybrania trzech osb z grupy czterech osb.
Istnieje sze sposobw wybrania dwch osb z grupy czterech osb. A zatem wyraenie (4, 2),
ktre nazwiemy wyraeniem lewym, daje sze nastpujcych kombinacji:
@3M @CM @<M 3CM 3<M C<

Brakujcym czonkiem grupy jest alpinista A, a zatem, aby uzyska zesp trzyosobowy, dopisujemy A do uzyskanych wynikw:
1@3M 1@CM 1@<M 13CM 13<M 1C<

Istniej cztery sposoby wybrania trzech osb z grupy czterech osb. A zatem wyraenie (4, 3),
ktre nazwiemy wyraeniem prawym, daje cztery kombinacje:
@3CM @3<M @C<M 3C<

Dodajc kombinacje uzyskane z wyraenia prawego z kombinacjami uzyskanymi z wyraenia


lewego, dostajemy dziesi kombinacji stanowicych rozwizanie problemu.

NIEKTRE INTERESUJCE ZASTOSOWANIA REKURENCJI

291

Ten sam proces rozbioru mona zastosowa take do wyznaczenia kombinacji dla obu grup
skadajcych si z czterech osb. I tak, (4, 2) to (3, 1) + (3, 2). Jak wida, wykorzystanie rekurencji jest naturalnym sposobem rozwizania tego problemu.
Przedstawiony tu problem mona sobie wyobrazi jako drzewo, w ktrym w pierwszym wierszu znajduje si wyraenie (5, 3), w drugim wyraenia (4, 3) oraz (4, 2), i tak dalej; przy czym
poszczeglne wzy drzewa odpowiadaj rekurencyjnym wywoaniom metody. Wygld takiego
drzewa dla problemu wyboru trzech osb z grupy piciu (5, 3) zosta przedstawiony na rysunku 6.20.

RYSUNEK 6.20.
Wybieranie
trzyosobowego
zespou z grupy
piciu osb

Przypadkiem bazowym omawianego algorytmu s kombinacje nie majce adnego sensu takie, w ktrych wybierany zesp lub wielko grupy wynosi 0, lub w ktrych wielko wybieranego
zespou jest wiksza od iloci osb w caej grupie. Kombinacja (1, 1) jest poprawna, lecz jej dalszy
rozbir nie ma sensu. Na przedstawionym rysunku linie kropkowane przedstawiaj przypadki bazowe, ktre powoduj zakoczenie metody.
Gboko rekurencyjnych wywoa odpowiada iloci czonkw grupy. I tak: wierzchoek w grnym wierszu odpowiada alpinicie A, dwa wierzchoki w drugim wierszu odpowiadaj alpinicie B
i tak dalej. Jeli grupa liczy pi osb, drzewo bdzie miao pi poziomw gbokoci.
Schodzc w d drzewa, naley pamita sekwencj odwiedzanych czonkw grupy. Oto
w jaki sposb mona to zrealizowa: w przypadku wywoywania metody odpowiadajcej lewemu
wyraeniu, aktualny wierzchoek jest zapamitywany poprzez dodanie jego litery do sekwencji. Wywoania odpowiadajce lewym wyraeniom oraz litery dodawane do sekwencji zostay przedstawione na rysunku pogrubion lini. W czasie powrotu do gry konieczne bdzie usuwanie kolejnych
liter z sekwencji.
Aby zapamita wszystkie sekwencje, mona je wywietla podczas dziaania algorytmu. Podczas realizacji wywoa odpowiadajcych lewym wyraeniom nie s wywietlane adne wyniki. Jednak podczas realizacji wywoa odpowiadajcych prawym wyraeniom, sekwencja jest sprawdzana,
a w przypadku gdy aktualny wierzchoek jest poprawny i gdy dodanie do niego jednej osoby dopeni
wybierany zesp, wierzchoek zostaje dodany do sekwencji, a wyznaczony w ten sposb zesp
jest wywietlany.

292

6. REKURENCJA

Podsumowanie
Metoda rekurencyjna cyklicznie wywouje sam siebie, za kadym razem przekazujc w wywoaniu inne argumenty.
Przekazanie argumentu o pewnej wartoci powoduje, e metoda koczy dziaanie bez kolejnego wywoania samej siebie. Sytuacja ta jest nazywana przypadkiem bazowym.
Gdy najbardziej wewntrzne wywoanie metody zostaje zakoczone, rozpoczyna si proces
zakaczania kolejnych wywoa, ktry w kocu doprowadza do zakoczenia pocztkowego
wywoania.
Liczba trjktna to suma danej liczby oraz wszystkich liczb mniejszych od niej (w tym kontekcie liczba oznacza liczb cakowit). Na przykad liczba trjktna odpowiadajca liczbie 4
ma warto 10, gdy 4 + 3 + 2 + 1 wynosi 10.
Silnia liczby jest iloczynem tej liczby oraz wszystkich liczb mniejszych od niej. Na przykad
silnia 4 wynosi 4 3 2 1, czyli 24.
Zarwno liczby trjktne, jak i silnie mona oblicza za pomoc metod rekurencyjnych lub
zwyczajnej ptli.
Anagram sowa (wszystkie moliwe kombinacje n liter tworzcych sowo) mona wyznaczy
rekurencyjnie poprzez cykliczne przesuwanie wszystkich liter sowa i wyznaczanie anagramu
wszystkich n 1 liter sowa z pominiciem jego skrajnej lewej litery.
Wyszukiwanie binarne mona przeprowadzi rekurencyjnie, sprawdzajc, w ktrej powce posortowanego zakresu znajduje si poszukiwany klucz, a nastpnie wykonujc te same czynnoci
dla wyznaczonej powki.
Zagadka Wie Hanoi skada si z trzech kolumn oraz dowolnej iloci dyskw.
Zagadk Wie Hanoi mona rozwiza rekurencyjnie, przenoszc cae poddrzewo dyskw, z wyjtkiem najwikszego z nich, na kolumn pomocnicz, a nastpnie przenoszc ostatni, najwikszy dysk na kolumn docelow.
Scalenie dwch posortowanych tablic oznacza utworzenie trzeciej tablicy, zawierajcej wszystkie elementy scalanych tablicy, ktre dodatkowo s odpowiednio posortowane.
W algorytmie sortowania przez scalanie jednoelementowe podtablice stanowice fragmenty caej
tablicy s scalane w podtablice dwuelementowe, ktre nastpnie s scalane w podtablice czteroelementowe, i tak dalej. Proces ten jest kontynuowany do momentu posortowania caej tablicy.
Algorytm sortowania przez scalanie ma zoono rzdu O(N logN).
Algorytm ten wykorzystuje przestrze robocz, ktrej wielko odpowiada wielkoci sortowanej tablicy.
Rekurencyjne metody, wyznaczajce liczby trjktne, silnie, anagramy oraz realizujce wyszukiwanie binarne, zawieraj tylko jedno rekurencyjne wywoanie samych siebie (w kodzie metody realizujcej wyszukiwanie binarne s, co prawda, umieszczone dwa rekurencyjne wywoania,
jednak podczas realizacji metody wykonywane jest tylko jedno z nich).
W przypadku rekurencyjnego algorytmu rozwizujcego problem Wie Hanoi oraz algorytmu
sortowania przez scalanie, metoda zawiera dwa rekurencyjne wywoania samej siebie.
Kady problem, ktry mona rozwiza rekurencyjnie, mona take rozwiza z wykorzystaniem stosu.
Niektre rozwizania rekurencyjne mog by nieefektywne. W takim przypadkach mona je
zastpi rozwizaniami wykorzystujcymi zwyczajn ptl lub stos.

PYTANIA

293

Pytania
Przedstawione poniej pytania, naley potraktowa jako test, ktry pozwoli Czytelnikowi sprawdzi
wiadomoci. Odpowiedzi na postawione pytania mona znale w dodatku C.
(1) Jeli w programie triangle.java (listing 6.1) uytkownik wpisze 10, to jaka jest maksymalna
ilo kopii metody 
(a w zasadzie ilo kopii argumentw tej metody)?
(2) Gdzie s przechowywane kopie argumentw, o ktrych bya mowa pytaniu 1.?
(a) W zmiennej zdefiniowanej w metodzie 
.
(b) We waciwociach klasy 41''.
(c) W zmiennej zdefiniowanej w metodzie 7
.
(d) Na stosie.
(3) Zamy, e w pytaniu 1. uytkownik wpisa warto 10. Jaka bdzie warto , w momencie
gdy metoda 
zwrci warto inn ni 1?
(4) Zamy, e zachodzi ta sama sytuacja, ktra zostaa opisana w pytaniu 1. Jaka bdzie warto , w chwili gdy metoda 
przekae warto do metody 
?
(5) Prawda czy fasz: wartoci zwracane przez metod 
s przechowywane na stosie.
(6) W programie anagram.java (listing 6.2) na pewnym etapie rekurencyjnej sekwencji wywoa
metoda  1
operuje na acuchu znakw . Na jakich literach bdzie operowa
kolejna, rekurencyjnie wywoana wersja metody?
(7) Przedstawione przykady (a konkretnie program orderedArray.java z listingu 2.4 wykorzystujcy ptl oraz rekurencyjny program binarySearch.java z listingu 6.3) pokazay, e wywoania rekurencyjne mona umieszcza wewntrz ptli. Ktre z poniszych stwierdze nie jest
prawdziwe?
(a) Oba ze wspomnianych programw dzieliy tablic, na ktrej operoway, na poow.
(b) Jeli klucz nie zosta odnaleziony, to program wykorzystujcy ptl koczy si, gdy zostanie
przekroczony zakres tablicy, natomiast program rekurencyjny ze wzgldu na dotarcie do
najniszego poziomu rekurencyjnych wywoa.
(c) Jeli klucz zostanie odnaleziony, to w programie wykorzystujcym ptl koczy si dziaanie
caej metody, natomiast w programie rekurencyjnym tylko jednego poziomu wywoania.
(d) W rekurencyjnej wersji metody przeszukiwany zakres naley okreli przy uyciu argumentw; natomiast w programie wykorzystujcym ptl nie ma takiej koniecznoci.
(8) W algorytmie wyszukiwania binarnego, ktry nie wykorzystuje rekurencji, uywana jest ptla. Co zastpuje t ptl w metodzie %Q
w programie binarySearch.java (listing 6.3)?
(a) Metoda %Q
.
(b) Argumenty metody %Q
.
(c) Rekurencyjne wywoanie metody %Q
.
(d) Wywoanie metody %Q
umieszczone w metodzie 
.
(9) Program binarySearch.java jest przykadem _________ rozwizywania problemu.
(10) Co staje si coraz mniejsze podczas wykonywania kolejnych rekurencyjnych wywoa metody %Q
?
(11) Co staje si coraz mniejsze podczas wykonywania kolejnych rekurencyjnych wywoa metody w programie towers.java (listing 6.4)?
(12) W algorytmie stosowanym w programie towers.java
(a) S wykorzystywane drzewa bdce urzdzeniami sucymi do przechowywania danych.
(b) Mniejsze dyski s potajemnie umieszczane pod wikszymi dyskami.
(c) Kolumna docelowa i pomocnicza s zamieniane.
(d) Przenoszony jest jeden najmniejszy dysk, a nastpnie cay stos wikszych dyskw.

294

6. REKURENCJA

(13) Ktre z poniszych stwierdze dotyczcych metody 


z programu merge.java (listing 6.5)
nie jest prawdziwe:
(a) Algorytm zaimplementowany w tej metodzie moe obsugiwa tablice rnej wielkoci.
(b) Konieczne jest przeszukanie tablicy docelowej, w celu okrelenia miejsca, gdzie naley
wstawi kolejny element.
(c) Metoda nie jest rekurencyjna.
(d) Metoda cigle pobiera najmniejszy element, niezalenie od tego, w jakiej tablicy jest on
zapisany.
(14) Wad algorytmu sortowania przez scalanie jest:
(a) Fakt, i nie jest to algorytm rekurencyjny.
(b) Wykorzystanie znacznych iloci pamici.
(c) Efektywno, ktra jest wiksza ni w sortowaniu przez wstawianie, lecz znacznie mniejsza
ni w algorytmie quicksort;
(d) Dua zoono algorytmu i problemy z jego implementacj.
(15) Oprcz ptli, rekurencj czsto mona take zastpowa _______.

Eksperymenty
Wykonanie poniszych eksperymentw umoliwi dokadne zrozumienie zagadnie omawianych
w tym rozdziale. Eksperymenty te nie wymagaj pisania jakichkolwiek programw.
(1) W programie triangle.java (listing 6.1) naley usun przypadek bazowy (fragmenty kodu: +

,    oraz ), a nastpnie uruchomi program i sprawdzi, co si stanie.
(2) Korzystajc z apletu Towers Workshop, naley rozwiza zagadk Wie Hanoi, operujc na
siedmiu lub wikszej iloci dyskw.
(3) Naley zmodyfikowa metod 
programu mergeSort.java (listing 6.6) w taki sposb, aby
tablica moga by wypeniana setkami tysicy losowych liczb. Po wprowadzeniu modyfikacji
naley uruchomi program w celu posortowania tablicy i porwna szybko jego dziaania z algorytmami sortowania przedstawionymi w rozdziale 3., Proste algorytmy sortowania.

Projekty programw
Napisanie programw stanowicych rozwizanie projektw przedstawionych w tej czci rozdziau
moe utrwali zrozumienie zagadnie omawianych w tym rozdziale i pokaza, w jaki sposb zagadnienia te mog by stosowane w praktyce.
(6.1) Zamy, e kupilimy tani kieszonkowy komputer PC i odkrylimy, e jego procesor nie jest
w stanie wykonywa operacji mnoenia jedynie dodawanie. W celu rozwizania tego problemu napisalimy rekurencyjn metod  
, ktra wykonuje mnoenie liczby x i y, dodajc liczb x do siebie samej y razy. Napisz t metod oraz metod 
, w ktrej bdzie
ona wywoywana. Czy operacja dodawania jest wykonywana w momencie rekurencyjnego wywoywania metody, czy te w chwili gdy metoda zwraca wynik?
(6.2) W rozdziale 8., Drzewa binarne zostan przedstawione zagadnienia zwizane z drzewami
binarnymi, w ktrych kada ga (potencjalnie) ma dokadnie dwie podgazie. Gdyby takie
drzewo narysowa na ekranie, to w grnym wierszu znalazaby si jedna ga, w nastpnym

PROJEKTY PROGRAMW

295

wierszu dwie, a w kolejnych: 4, 8 16 i tak dalej. Poniej zosta przedstawiony wygld takiego drzewa o szerokoci 16 znakw:
""""""""W"""""""
""""W"""""""W"""
""W"""W"""W"""W"
"W"W"W"W"W"W"W"W
WWWWWWWWWWWWWWWW

Naley zauway, ze dolny wiersz powinien by przesunity o p znaku w prawo, jednak


wywietlajc drzewo w trybie tekstowym nic na to nie mona poradzi.
Takie drzewo mona wywietli, wykorzystujc rekurencyjn metod @%
, do ktrej
przekazywane s argumenty + oraz , okrelajce krace poziomego zakresu wywietlania gazi. W momencie pierwszego wywoania metody argument + przyjmuje warto 0,
a wartoci argumentu  jest liczba znakw w wierszu (cznie ze znakami minusa) pomniejszona o 1. Znak W jest wywietlany w samym rodku tego zakresu. Nastpnie metoda
dwukrotnie rekurencyjnie wywouje sam siebie. Pierwsze z tych wywoa obsuguje lew
powk przekazanego zakresu, a drugi praw. Wykonywanie metody koczy si, gdy przekazany do niej zakres jest zbyt may. Prawdopodobnie warto umieszcza wszystkie minusy i W
w jednej tablicy, a nastpnie wywietla ca jej zawarto, posugujc si pewn metod (na
przykad o nazwie '
). Napisz metod 
, ktra bdzie wywietla drzewo, wykorzystujc w tym celu metody @%
oraz '
. Metoda 
powinna dawa
moliwo okrelania szerokoci wiersza (na przykad 32, 64 lub dowolnej innej). Dodatkowo
naley zagwarantowa, e tablica przechowujca wywietlane wiersze nie bdzie wiksza ni
to konieczne. Jak jest zaleno pomidzy iloci wierszy drzewa (w przedstawionym drzewie
jest ich pi) a ich szerokoci?
(6.3) Zaimplementuj rekurencyjn metod podnoszc liczb do potgi, dziaajc zgodnie z zaoeniami przedstawionymi w czci rozdziau, zatytuowanej Podnoszenie liczby do potgi. Napisz rekurencyjn metod ' 
oraz metod 
, ktra umoliwiaaby jej przetestowanie.
(6.4) Napisz program rozwizujcy zagadnienie pakowania plecaka, ktry umoliwiaby operowanie
na plecaku o dowolnej pojemnoci oraz dowolnej grupie umieszczanych w nim elementw.
Naley zaoy, e wagi elementw s zapisywane w tablicy. Podpowied argumentami wywoania rekurencyjnej metody '%
s: waga docelowa oraz indeks okrelajcy fragment
tablicy, w ktrym s zapisane pozostae analizowane elementy.
(6.5) Zaimplementuj rekurencyjny algorytm rozwizujcy problem wygenerowania wszystkich moliwych grup z pewnego zbioru elementw (n elementw wybieranych k razy). Napisz rekurencyjn metod  4
oraz metod 
, ktra bdzie prosi uytkownika od podanie
wielkoci zbioru oraz iloci wybieranych elementw, a nastpnie przekazywa te informacje
w wywoaniu metody  4
. Z kolei metoda  4
ma wywietla wszystkie wygenerowane kombinacje.

You might also like