Matematyka Dyskretna Andrzej Szepietowski 25 czerwca 2002 roku
Rozdział 1 Rekurencja 11 Wieże Hanoi Rekurencja jest to zdolność podprogramu (procedury lub funkcji) do wywoływania samego siebie Zacznijmy od przykładu wież Hanoi Przypuśćmy, że mamy trzy wieże lub trzy paliki:, i Na pierwszym paliku,, znajduj a siȩ trzy kr ażki różnej wielkości, nanizane w porz adku od najwiȩkszego na dole do najmniejszego na górze Paliki i s a na pocz atku puste Należy przenieść wszystkie kr ażki z palika w razie potrzeby palikiem, według nastȩpuj acych reguł: można przenosić po jednym kr ażku z jednego palika na inny, nie można umieszczać wiȩkszego kr ażka na mniejszym na, posługuj ac siȩ Rozwi azaniem tej łamigłówki dla trzech kr ażków jest nastȩpuj acy ci ag siedmiu przełożeń: oznacza przeniesienie szczytowego kr ażka z palika na palik gdzie zapis Chodzi nam teraz o algorytm, który dla dowolnej liczby operacji potrzebnych do przełożenia kr ażków z palika na palik Algorytm przekładania kr ażków jeżeli, to przekładamy ten jeden kr ażek jeżeli, to: przekładamy kr ażków z razie potrzeby palikiem ), przekładamy -ty kr ażek z na, przekładamy kr ażków z na (za pomoc a palika ) 3, kr ażków wypisze ci ag na pomocniczy palik (posługuj ac siȩ w
4 Rozdział 1 Rekurencja Nietrudno zauważyć, że jeżeli proces przekładania kr ażków jest prawidłowy, to cały proces też jest prawidłowy, ponieważ obecność najwiȩkszego kr ażka na dole palika nie przeszkadza w przekładaniu mniejszych kr ażków Powyższy algorytm opiszmy teraz za pomoc a rekurencyjnej procedury przenieś, która odwołuje siȩ sama do siebie i wypisuje ci ag instrukcji przeniesienia kr ażków z palika na palik procedura przenieś( kr ażków z na, za pomoc a ): jeżeli, to wypisz, jeżeli, to przenieś( kr ażków z na, za pomoc a ), wypisz, przenieś( kr ażków z na, za pomoc a ) Rysunek 11: Schemat działania procedury przenieś dla wież Hanoi z trzema kr ażkami Na rysunku 81 zilustrowano działanie procedury przenieś dla Skrót oznacza wywołanie procedury przenieś( kr ażków z na, za pomoc a ) Strzałki w dół oznaczaj a wywołanie procedury, strzałki w górȩ powroty po wykonaniu procedury, a strzałki poziome odpowiadaj a nastȩpstwu instrukcji w ramach jednego wykonania procedury
12 Algorytm Euklidesa, wersja rekurencyjna 5 12 Algorytm Euklidesa, wersja rekurencyjna Innym przykładem algorytmu rekurencyjnego może być rekurencyjna wersja algorytmu Euklidesa, który oblicza najwiȩkszy wspólny dzielnik dwóch dodatnich liczb naturalnych i : fun kcja NWD(a,b): jeżeli, to jeżeli, to jeżeli, to,, W jȩzyku Pascal powyższ a procedurȩ możemy zapisać w nastȩpuj acy sposób: function NWD(a,b:integer):integer; begin end; if a=b then NWD:=a else if then NWD:=NWD(a-b,b) else NWD:=NWD(a,b-a) Rysunek 12: Schemat działania rekurencyjnej wersji algorytmu Euklidesa NWD(5,3):=1 NWD(2,3):=1 NWD(2,1):=1 NWD(1,1):=1 Na rysunku 82 przedstawiono proces obliczania funkcji NWD(7,3) 13 Funkcje rekurencyjne Czasami wygodnie jest zdefiniować funkcje za pomoc a wzoru rekurencyjnego Na przykład funkcjȩ silnia definiuje siȩ zwykle za pomoc a nastȩpuj acych dwóch równań: "
6 Rozdział 1 Rekurencja Podobnie można definiować inne funkcje ze zbioru liczb naturalnych w zbiór liczb naturalnych Definicja taka zawiera przepis, jak policzyć wartość funkcji dla wartości pocz atkowych, oraz drugi przepis, jak wyliczyć wartość dla argumentu za pomoc a wartości funkcji dla mniejszych argumentów 14 Funkcja (ci ag) Fibonacciego Nastȩpnym przykładem rekurencyjnego definiowania funkcji jest funkcja Fibonacciego, określona równaniami: Kolejne wartości funkcji Fibonacciego to: Udowodnimy teraz przez indukcjȩ, że (11) gdzie " oraz " Równość (11) zachodzi dla i Załóżmy teraz, że zachodzi dla wszystkich argumentów mniejszych od Zauważmy, że oraz s a rozwi azaniami równania, mamy wiȩc oraz a także oraz Łatwo teraz można pokazać, że Ponieważ, mamy, wiȩc wartość jest równa po zaokr agleniu do najbliższej liczby naturalnej i funkcja Fibonacciego rośnie wykładniczo 15 Funkcja Ackermanna, nastȩpuj acymi rów- Funkcja Ackermanna określona jest, dla liczb naturalnych #" naniami: &% $" #" $" $" " Funkcja Ackermanna jest przykładem funkcji maj acej dość prost a definicjȩ, ale jest praktycznie nieobliczalna z tego powodu, że jej wartości szybko rosn a Na przykład: ( ) +*, "
16 Algorytm sortowania przez scalanie 7 ) ) ) ) ) i ogólnie ) 16 Algorytm sortowania przez scalanie Zajmijmy siȩ teraz pewnym prostym rekurencyjnym algorytem sortowania ci agu Dla prostoty załóżmy, że długość ci agu jest potȩg a dwójki Algorytm sortowania jeżeli ci ag ma długość jeden, to jest już posortowany, jeżeli ci ag jest dłuższy, to: dzielimy go na połowy, sortujemy te połowy, ł aczymy posortowane połowy w jeden posortowany ci ag Istota pomysłu polega na tym, że można szybko poł aczyć dwa posortowane ci agi w jeden posortowany ci ag Algorytm ł aczenia wyjaśnijmy na przykładzie Przypuśćmy, że mamy dwa ci agi: jest pusty Ustawiamy dwa wskaźniki po jednym na pocz atku każdego ci agu (wskazane elementy bȩd a oznaczone daszkiem): i że chcemy je poł aczyć w posortowany ci ag Na pocz atku ci ag Porównujemy wskazane elementy Mniejszy z porównanych elementów przepisujemy na ci ag i przesuwamy wskaźnik w tym ci agu, z którego był wziȩty element do ci agu W wyniku otrzymamy: Powtarzamy ten proces tak długo, aż w jednym z ci agów ostatni element zostanie zabrany do ci agu
8 Rozdział 1 Rekurencja W takiej sytuacje pozostałe elementy tego drugiego ci agu przenosimy do ci agu : Liczba porównań potrzebna do scalenia ci agów nie jest wiȩksza od sumy długości tych ci agów Algorytm merge-sort (inaczej sortowanie przez scalanie), który sortuje ci ag, można rekurencyjnie opisać tak (rysunek 83): merge-sort(s): jeżeli ma tylko jeden element, to koniec, jeżeli ma wiȩcej elementów, to: dzielimy ci ag na połowy i merge-sort( ),, merge-sort( ł aczymy i ), Rysunek 13: Schemat działania algorytmu merge-sort dla ci agu 3, 7, 5, 2, 6, 1, 8, 4 3752 6186 37 52 61 84 3 7 5 2 6 1 8 4 3 7 5 2 6 1 8 4 37 25 16 48 2357 1468 12345678 Algorytm merge-sort jest przykładem algorytmu typu dziel i zwyciȩżaj, którego ogólny schemat wygl ada tak: jeżeli problem jest małego rozmiaru, to rozwi azujemy go bezpośrednio,
17 Rozwi azywanie równań i nierówności rekurencyjnych 9 jeżeli problem jest duży, to: dzielimy problem na podproblemy, rozwi azujemy podproblemy, ł aczymy rozwi azania podproblemów w rozwi azanie całego problemu 17 Rozwi azywanie równań i nierówności rekurencyjnych Oszacujmy teraz czas działania algorytmu sortowania przez scalanie Niech oznacza liczbȩ operacji porównania potrzebn a do posortowania ci agu długości Mamy nastȩpuj ace oszacowania: (12) (13) Druga zależność wynika st ad, że aby posortować ci ag długości, sortujemy dwa ci agi długości, a nastȩpnie potrzebujemy porównań, aby scalić te dwie połówki Dla prostoty rozważań zakładamy tutaj, że jest potȩg a dwójki, dka jakiegoś naturalnego Istnieje wiele sposobów wyliczania lub szacowania funkcji określonej rekurencyjnie Przedstawimy teraz dwa najprostsze z nich: metodȩ podstawiania i metodȩ iteracji 18 Metoda podstawiania W metodzie podstawiania odgadujemy rozwi azanie albo jego oszacowanie, a nstȩpnie pokazujemy, że jest ono poprawne Pokażemy działanie tej metody szacuj ac złożoność czasow a merge-sortu określon a rekurencj a (12)-(13) Zgadujemy, że dla jakiejś stałej i udowodnimy przez indukcjȩ, że powyższa nierówność zachodzi dla każdego potȩgi dwójki Zachodzi ona dla Zakładamy teraz, że i podstawiamy do nierówności (13) Ostatnia nierówność jest spełniona, jeżeli Metoda podstawiania została zastosowana w podrozdziale o funkcji Fibonacciego do pokazania, że (14)
10 Rozdział 1 Rekurencja ale tam odgadniȩto dokładne rozwi azanie Teraz pokażemy jak dojść do rozwi aznia zaczynaj ac od ogólniejszej postaci Zacznijmy od równania (15) Sprawdźmy, jakie funkcje postaci, spełniaj a to równanie Po podstawieniu do równania (15) mamy Po podzieleniu stromnami przez, otrzymamy " Jest to równanie kwadratowe z dwoma rozwi azaniami, czyli dwie funkcje oraz Zauważmy, że także każda funkcja postaci gdzie i oraz spełniaj a równanie (15) to stałe, spełnia równanie (15) Sprawdźmy teraz, dla jakich stałych i funkcja spełnia zależności Powyższy układ jest spełniony dla i Otrzymujemu układ równości Tak wiȩc otrzymujemy wzór na funkcjȩ Fibonacciego (16) 19 Metoda iteracyjna Moteda iteracyjna polega na rozwijaniu rekursji Jako pierwszy przykład rozważmy zależność Dla uproszczenia zakładamy, że jest potȩg a rozwijamy w nastȩpuj acy sposób:, dla jakiegoś naturalnego Funkcjȩ
) ) 110 Metoda rekurencji uniwersalnej 11,,,, Iteracjȩ powtarzamy, aż ostatni składnik bȩdzie zawierał Otrzymamy wtedy, Skorzystaliśmy tu z równości Jako drugi przykład rozważmy rekursjȩ oraz z faktu, że * Jak bȩdziemy j a rozwijać, to otrzymamy Dla Otrzymamy wtedy 110 Metoda rekurencji uniwersalnej, czyli gdy * i (17) Przypuśćmy, że mamy równanie rekurencyjne (18)
12 Rozdział 1 Rekurencja gdzie i Równanie takie otrzymamy szacuj ac czas działania algorytmu rekurencyjnego, który metod a "dziel i rz adź" dzieli problem na podproblemów rozmiaru Funkcja opisuje czas potrzebny na podzielenie problemu na podproblemy i na poł aczenie rozwi azań podproblemów w rozwi azanie całego problemu Na koniec podamy bez dowodu twierdzenie mówi ace jak można szacować funkcjȩ określon a równaniem (18) Twierdzenie 11 (o rekurencji uniwersalnej) Niech bȩdzie określone dla nieujemnych liczb całkowitych równaniem rekurencyjnym " gdzie, i " oznacza " lub Wtedy Jeżeli dla pewnej stałej, to Jeżeli, to Jeżeli dla pewnej stałej oraz pewnej stałej, to 111 Zadania 1 Napisz program, który rekurencyjnie oblicza: a) funkcjȩ silnia, b) funkcjȩ Fibonacciego, c) funkcjȩ wykładnicz a dla 2 Napisz program, który oblicza symbol Newtona: a) według wzoru rekurencyjnego b) według wzoru Porównaj te programy 3 Napisz program, który rekurencyjnie oblicza funkcjȩ: 4 Oblicz według rekurencyjnego algorytmu Euklidesa 5 Według algorytmu ł aczenia poł acz ci agi i
111 Zadania 13 6 Stosuj ac algorytm merge-sort posortuj ci ag słów: słowik, wróbel, kos, jaskółka, kogut, dziȩcioł, gil, kukułka, szczygieł, sowa, kruk, czubatka [Fragment wiersza Ptasie radio Juliana Tuwima] 7 Dana jest funkcja Oblicz : Co oblicza funkcja? 8 Dana jest funkcja Oblicz : Co oblicza funkcja? 9 Wypisz ci ag przełożeń potrzebnych do przeniesienia czterech kr ażków na wieżach Hanoi 10 Udowodnij, że algorytm opisany w podrozdziale 81 wymaga przełożeń do przeniesienia kr ażków "