Rekurencja. Przykład. Rozważmy ciąg

Podobne dokumenty
FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

UNIWERSYTET GDAŃSKI MATERIAŁY DYDAKTYCZNE DO PRZEDMIOTU MATEMATYKA DYSKRETNA. pod redakcją: Hanna Furmańczyk Karol Horodecki Paweł Żyliński

ALGORYTMY I STRUKTURY DANYCH

Rekurencja (rekursja)

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

Algorytmy. wer Wojciech Myszka 30 listopada 2008

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 5. Karol Tarnowski A-1 p.

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wstęp do programowania

Algorytmy i struktury danych. Wykład 4

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Metody algortmiczne (Algorytmy Część IV)

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Strategia "dziel i zwyciężaj"

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Analiza algorytmów zadania podstawowe

Zadanie 1. Test (6 pkt) Zaznacz znakiem X w odpowiedniej kolumnie P lub F, która odpowiedź jest prawdziwa, a która fałszywa.

Wykład 8. Rekurencja. Iterować jest rzeczą ludzką, wykonywać rekursywnie boską. L. Peter Deutsch

Złożoność obliczeniowa zadania, zestaw 2

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

Zadania do samodzielnego rozwiązania

Przykładowe zadania z teorii liczb

Rekurencja. Przygotowała: Agnieszka Reiter

Teoretyczne podstawy informatyki

EGZAMIN MATURALNY Z INFORMATYKI

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

Jarosław Wróblewski Matematyka Elementarna, lato 2012/13. W dniu 21 lutego 2013 r. omawiamy test kwalifikacyjny.

ALGORYTMY MATEMATYCZNE Ćwiczenie 1 Na podstawie schematu blokowego pewnego algorytmu (rys 1), napisz listę kroków tego algorytmu:

Zad. 1 Zad. 2 Zad. 3 Zad. 4 Zad. 5 SUMA

Jeszcze o algorytmach

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Matematyka Dyskretna 2/2008 rozwiązania. x 2 = 5x 6 (1) s 1 = Aα 1 + Bβ 1. A + B = c 2 A + 3 B = d

1. Liczby wymierne. x dla x 0 (wartością bezwzględną liczby nieujemnej jest ta sama liczba)

Sortowanie przez scalanie

5. Rekurencja. Przykłady

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

Dr inż. Robert Wójcik, p. 313, C-3, tel Katedra Informatyki Technicznej (K-9) Wydział Elektroniki (W-4) Politechnika Wrocławska

1.1. Uzupełnij poniższą tabelę: i wynik(i)

Wykład z równań różnicowych

12. Rekurencja. UWAGA Trzeba bardzo dokładnie ustalić <warunek>, żeby mieć pewność, że ciąg wywołań się zakończy.

Informatyka I Lab 06, r.a. 2011/2012 prow. Sławomir Czarnecki. Zadania na laboratorium nr. 6

1. Wykład NWD, NWW i algorytm Euklidesa.

Wybrane zagadnienia teorii liczb

INŻYNIERIA BEZPIECZEŃSTWA LABORATORIUM NR 2 ALGORYTM XOR ŁAMANIE ALGORYTMU XOR

Teoria liczb. Zajmuje się własnościami liczb, wszystkim całkowitych

TEORETYCZNE PODSTAWY INFORMATYKI

Treść wykładu. Pierścienie wielomianów. Dzielenie wielomianów i algorytm Euklidesa Pierścienie ilorazowe wielomianów

Matematyczne Podstawy Informatyki

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

Zaawansowane algorytmy i struktury danych

Algorytmy w teorii liczb

EGZAMIN MATURALNY Z INFORMATYKI. 10 maja 2017 POZIOM ROZSZERZONY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I

Teoria liczb. Magdalena Lemańska. Magdalena Lemańska,

ZADANIE 1. Ważenie (14 pkt)

Programowanie dynamiczne

Zadanie 1. Potęgi (14 pkt)

Poprawność semantyczna

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Zadania język C++ Zad. 1. Napisz program wczytujący z klawiatury wiek dwóch studentów i wypisujący informację o tym, który z nich jest starszy.

Projekt Era inżyniera pewna lokata na przyszłość jest współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

Teoretyczne podstawy informatyki

Programowanie w VB Proste algorytmy sortowania

Maciej Grzesiak. Wielomiany

2. Liczby pierwsze i złożone, jednoznaczność rozkładu na czynniki pierwsze, największy wspólny dzielnik, najmniejsza wspólna wielokrotność.

Jarosław Wróblewski Matematyka Elementarna, lato 2014/15

Programowanie - wykład 4

funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Twój wynik: 4 punktów na 6 możliwych do uzyskania (66,67 %).

Matematyka dyskretna. Andrzej Łachwa, UJ, /10

Jarosław Wróblewski Matematyka Elementarna, zima 2011/12

Teoria automatów i języków formalnych. Określenie relacji

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Programowanie dynamiczne i algorytmy zachłanne

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Matematyka dyskretna - 7.Drzewa

Laboratorium nr 1. i 2.

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 9 Rekurencja

Porządek symetryczny: right(x)

Sortowanie. LABORKA Piotr Ciskowski

Algorytmy i Struktury Danych, 2. ćwiczenia

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Funkcje i tablice. Elwira Wachowicz. 23 maja 2013

Algorytm. a programowanie -

1 Wprowadzenie do algorytmiki

Przykładami ciągów, które Czytelnik dobrze zna (a jeśli nie, to niniejszym poznaje), jest ciąg arytmetyczny:

7. CIĄGI. WYKŁAD 5. Przykłady :

Wstęp do programowania

Informatyka A. Algorytmy

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Zadanie 1. Algorytmika ćwiczenia

Przypomnienie wiadomości dla trzecioklasisty C z y p a m i ę t a s z?

Podprogramy. Procedury

Uniwersytet Kazimierza Wielkiego w Bydgoszczy Zespół Szkół nr 5 Mistrzostwa Sportowego XV Liceum Ogólnokształcące w Bydgoszczy

Składnia funkcji i Rekurencja w języku Haskell

Transkrypt:

Rekurencja Definicje rekurencyjne Definicja: Mówimy, iż ciąg jest zdefiniowany rekurencyjnie, jeżeli: (P) Określony jest pewien skończony zbiór wyrazów tego ciągu, zwykle jest to pierwszy wyraz tego ciągu lub kilka jego pierwszych wyrazów. (R) Pozostałe wyrazy ciągu są zdefiniowane za pomocą poprzednich wyrazów ciągu. Wzór definiujący ciąg w taki sposób nazywamy zależnością rekurencyjną. Przykład. Rekurencyjna definicja ciągu SILNI, inaczej rekurencyjna definicja silni: (P) silnia(0) = (R) silnia(n+) = (n+) silnia(n) dla każdego n N. Przykład. Rozważmy ciąg SUM (n) n i i. W celu napisania programu komputerowego obliczającego wartości ciągu (SUM) n N dla dużych n, należy zapisać ten ciąg rekurencyjnie: (P) SUM() = (R) SUM(n+) = SUM(n) + (n+) dla każdego n N. Wyrazy ciągu zdefiniowanego rekurencyjnie można obliczać na wiele rozmaitych sposobów. Przykładowo, za pomocą obliczeń iteracyjnych znajdowana jest wartość n-tego wyrazu a n w oparciu o wyliczone uprzednio wartości wszystkich wyrazów ciągu poprzedzających wyraz a n, tj. wyrazów a, a,, a n-. Znajomość tych wyrazów ciągu jest niezbędna do obliczenia wartości wyrazu a n. Przykładowo, w przypadku powyżej zaprezentowanego ciągu (SILNI), w celu obliczenia wyrazu SILNI(95), należy obliczyć uprzednio wyrazy SILNI(k) dla k =,,94, nawet, jeśli większość (lub nawet wszystkie) poprzedzające wyrazy tego ciągu nie będą nigdzie indziej wykorzystane. Okazuje się jednak, iż w niektórych przypadkach istnieje bardziej efektywny sposób obliczenia wyrazu ciągu a n. Otóż, w obliczeniach rekurencyjnych wartość wyrazu ciągu a n zależy od pewnych wyrazów, a te z kolei zależą o innych, itd. zatem może okazać się, iż wartość wyrazu ciągu a n zależy tylko od stosunkowo niewielkiej liczby wyrazów poprzednich, a to sprawia, iż pozostałe wyrazy poprzednie można by pominąć. Przykład. Niech będzie dany ciąg (a n ) n N zdefiniowany następująco: (0) = 0, () =, (n) ( n / ) ( n / 5 ) dla n nalizując definicję tego ciągu, jest oczywistym, iż opłacalnym jest obliczanie wartości jego elementów rekurencyjnie, a nie iteracyjnie. Przykładowo: (9) = (46) + (8) = [(3) + (9)] + [(9) + (3)] = (3) + (9) +(3) = [() + (4)] + [(4) + ()] + () + (0) = () + 3(4) + 3() + (0) = (5) + () + 3[() + (0)] + 3() + (0) = (5) + 4() + 3() + 4(0) = () + () + 4[() + (0)] + 3() + 4(0) = () + 8() + 8(0) = () + (0) + 8() + 8(0) = 9() + 9(0) Jak widać, wprawdzie w obliczeniach wartości wyrazu (9) korzystamy z wartości pośrednich (46), (3), (8), (), (9), (5), (4), (3), (), (), (0), lecz w końcowym etapie potrzebne nam są tylko wartości () i (0).

Przykład. Niech będzie dany ciąg (a n ) n N zdefiniowany następująco: a 0 = 0, a n+ = a n + n. Zamiast wyliczać poszczególne wyrazy ciągu, można wykazać, iż a n = n n dla każdego n N. zatem do obliczenia dowolnego wyrazu ciągu (a n ) n N nie potrzeba obliczać żadnego z uprzednich wyrazów. Jeśli obliczamy wyrazy ciągu rekurencyjnie, to taki sposób ich obliczania wymaga pamięci dla przechowywania wartości pośrednich, które zostają wywoływane, ale jeszcze nie zostały obliczone. Jednak w niektórych przypadkach, może się okazać, iż liczba miejsc pamięci potrzebnych do przechowywania tych pośrednich wartości będzie stosunkowo niewielka. Przykładowo, w przypadku obliczeń rekurencyjnych silni np. SILNI(4) = 4 SILNI(3) = SILNI() = 4 SILNI() = 4 jest potrzebny tylko jeden adres w pamięci do przechowywania pośredniej (nieznanej) wartości silni. Przykład. Innym przykładem ilustrującym tę własność, jest obliczanie wartości ciągu Fibonacciego, który definiuje się w następujący sposób: (P) FIB(0) =, FIB() = (R) FIB(n) = FIB(n ) + FIB(n ) dla n Początkowymi wyrazami ciągu Fibonacciego są:,,, 3, 5, 8, 3,, 34, 55, 89. Przykładowo, FIB(4) = FIB(3) FIB() = [FIB() + FIB()] + [FIB() + FIB(0)] = [FIB() + FIB(0)] + FIB() + FIB(0) = 3FIB() + FIB(0) = 5 Jak widać z powyższego potrzebne są tylko dwa adresy do przechowania dwóch wartości pośrednich. Największy wspólny dzielnik - lgorytm Euklidesa Definicja. Liczba całkowita k jest dzielnikiem liczby całkowitej m wtedy i tylko wtedy, gdy m jest wielokrotnością liczby k, tzn. wtedy, gdy m = k p dla pewnej liczby p Z. W takim przypadku mówimy, iż k dzieli m. Ponieważ 0 = k 0, a zatem każda liczba jest dzielnikiem 0. Ponadto liczby m i m mają te same dzielniki. Prawdziwe jest także stwierdzenie, iż k jest dzielnikiem liczby m wtedy i tylko wtedy, gdy k jest dzielnikiem tej liczby. Z tego powodu zwykle ogranicza się rozważania do nieujemnych dzielników k nieujemnych liczb m. Jeśli m > 0 i m = k p, gdzie k, p Z, to k = m/p, zatem k = m/ p m. Zatem wszystkie dzielniki liczby m leżą w przedziale między m i m. Definicja. Wspólnym dzielnikiem liczb m i n jest taka liczba całkowita, która jest dzielnikiem zarówno m, jak i n. Jest oczywistym, iż liczby i są zawsze wspólnymi dzielnikami m i n. Definicja. Jeśli liczby m i n nie są obie równe 0, to mogą mieć tylko skończoną liczbę wspólnych dzielników. Wtedy największy z nich nazywamy największym wspólnym dzielnikiem liczb m i n i oznaczamy go symbolem NWD(m,n). Przykład. Przykładowo wspólnymi dzielnikami liczb 8 i są liczby,, 4, a największym z nich jest 4. zatem NWD(8,) = 4. Przykładowo dzielnikami liczby są liczby, 3, 7,, zaś liczby są liczby,, 4, 8. zatem NWD(, ) =.

lgorytm NWD algorytm Euklidesa. Dopóki m n należy wykonywać:.a Jeśli m > n, należy podstawić m := m n;.b w przeciwnym wypadku, należy podstawić n := n m.. Jest zwracana liczba m. Przykład. Niech będą liczby m = 45 i n =. Kolejne etapy: (45,), (33,), (,), (9,), (9,3), (6,3), (3,3) Stąd NWD(45,) = 3. Szybki algorytm wyznaczania NWD(m, n).. W przypadku, gdy m n 0, należy wykonywać poniższe kroki:.a Jeśli m > n, podstaw m := m mod n;.b w przeciwnym wypadku podstaw n := n mod m.. Zwraca jest liczba max{n, m}. Przykład. Niech będą liczby m = 45 i n =. Kolejne etapy: (45,) (45 MOD, ) = (9,), (9, MOD 9) = (9,3), (9 MOD 3,3) = (0,3) Stąd max{0,3} = NWD(45,) = 3.

Sortowanie przez scalanie Innym przykładem algorytmu rekurencyjnego może być algorytm sortowania ciągu liczb (znaków). Dla uproszczenia będziemy zakładać, że długość ciągu jest potęgą dwójki. lgorytm sortowania przez scalanie merge-sort((a)).. Jeśli ciąg (a) ma tylko jeden element, zwróć ten ciąg.. W przeciwnym razie, należy wykonać następujące czynności:.a. podziel ciąg (a) na połowy (a) i (a);.b. zastosować algorytm sortowania do podciągu (a), tj. merge-sort(a);.c. zastosować algorytm sortowania do podciągu (a), tj. merge-sort(a);.d. połączyć ciągi (a) i (a) w jeden ciąg (a*) z zachowaniem kolejności i w ten sposób jako wynik jest zwracany jest ciąg (a*). Uwaga. Krok.d nazywany jest scalaniem i jego przebieg jest następujący. Na początku ciąg wynikowy jest pusty i ustawiamy po jednym wskaźniku na początku każdego ze scalanych ciągów (a) i (a). Z kolei porównujemy wskazywane elementy (do momentu, aż ich zabraknie), przy czym mniejszy z porównanych elementów przepisujemy na ciąg wynikowy i przesuwamy wskaźnik w tym ciągu, z którego został pobrany element do ciągu wynikowego. Przykład. Należy wykonać krok.d. powyższego algorytmu, tj. scalić następujące ciągi liczb: (,5,9,,5,4) i (,3,4,7,4,). Rozwiązanie. ktualne pozycje wskaźników oznaczone są przez pogrubienie czcionki. (,5,9,,5,5) (,3,4,7,4,) = [] (,5,9,,5,5) (,3,4,7,4,) = [] (,5,9,,5,5) (,3,4,7,4,) = [,] (,5,9,,5,5) (,3,4,7,4,) = [,,3] (,5,9,,5,5) (,3,4,7,4,) = [,,3,4] (,5,9,,5,5) (,3,4,7,4,) = [,,3,4,5] (,5,9,,5,5) (,3,4,7,4,) = [,,3,4,5,7] (,5,9,,5,5) (,3,4,7,4,) = [,,3,4,5,7,9] (,5,9,,5,5) (,3,4,7,4,) = [,,3,4,5,7,0,] (,5,9,,5,5) (,3,4,7,4,) = [,,3,4,5,7,0,,4] (,5,9,,5,5) (,3,4,7,4,) = [,,3,4,5,7,0,,4,5] (,5,9,,5,5) (,3,4,7,4,) = [,,3,4,5,7,0,,4,5,] (,5,9,,5,5) (,3,4,7,4,) = [,,3,4,5,7,0,,4,5,,5] Ciąg liczb (znaków) można posortować za pomocą metody przez scalanie merge-sort używając tzw. drzewo rekursji powstające podczas obliczeń.

D r z e w o s c a l a n i a D r z e w o r e k u r s j i Rekurencja dr hab. prof. nadzw. Tadeusz ntczak Przykład. Przy użyciu metody przez scalanie merge-sort posortować ciąg 5, 8, 3,,, 4,, 7. Narysować drzewo rekursji powstające podczas wykonywania obliczeń podczas stosowania tego algorytmu. 5, 8, 3,, 4,, 9, 7 5, 8, 3, 4,, 9, 7 5, 8 3, 4, 9, 7 5 8 3 4 9 7 5, 8, 3, 4 7, 9, 3, 5, 8,, 4, 7, 9,, 3, 4, 5, 7, 8, 9 Inny przykładem wykorzystania drzewa rekursji jest przekładanie krążków różnej wielkości z jednego palika na drugi przy wykorzystaniu trzeciego palika. Przykład. Przypuśćmy, że mamy trzy paliki, B i C. Na paliku znajduje się n krążków rożnej wielkości, osadzonych w porządku od największego na dole do najmniejszego na górze. Paliki B i C są początkowo puste. Należy przenieść wszystkie krążki z palika na palik C, posługując się w razie potrzeby palikiem B, przy czym: (i) można przenosić tylko po jednym krążku; (ii) nie można umieszczać krążka większego na mniejszym. lgorytm Przełoż(n,,B,C): przekładanie n krążków z palika na C przy wykorzystaniu palika B.. Jeśli n =, to należy przełożyć krążek z na C.. W przeciwnym przypadku, należy wykonać następujące czynności:.a. należy zastosować algorytm do n krążków, tj. przełóż(n,,b,c); tzn. przekładanie odbywa się z palika na palik B;.b. należy przełożyć n-ty krążek z na C;.c. należy zastosować algorytm do n krążków, tj. przełóż (n,b,c,), tzn. przekładanie odbywa się z palika B na palik C

n Przykład. Zakładając, że wierzchołek o etykiecie odpowiada wywołaniu procedury przełóż(n,,b,c), należy narysować drzewo rekursji dla B,C przekładania czterech krążków z palika na B. Następnie należy wypisać ciąg przełożeń. 4 C,B 3 B,C B 3 C, C,B C B, B, C C, B B,C B C, C, B B, C B C, C, B B, C B C, Sposób przekładania krążków jest wyznaczony poprzez przeszukanie powyższego drzewa w tzw. porządku inorder, wypisując za każdym razem, kiedy odwiedzamy węzeł, wykonanie odpowiedniego przełożenia krążka n w kroku.b: #n: B. #: B; #: C; #: B C; #3: B; #: C ; #: C B; #: B; #4: C; #: B C; #: B ; #: C ; #3: B C; #: B; #: C; #: B C;