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

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

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

Podstawy Informatyki. Metalurgia, I rok. Rekurencja. skomplikowane zadanie. Rekurencja

Podstawy Informatyki. Metalurgia, I rok. Wykład 5 Rekurencja

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

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

Rekurencja (rekursja)

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

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

Algorytmy i struktury danych. Wykład 4

Rekurencja. Przygotowała: Agnieszka Reiter

ALGORYTMY I STRUKTURY DANYCH

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

Analiza algorytmów zadania podstawowe

Algorytmy. wer Wojciech Myszka 30 listopada 2008

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

Wykład 3. Metoda dziel i zwyciężaj

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

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

Matematyka dyskretna. Andrzej Łachwa, UJ, a/15

Zadanie 1. Zmiana systemów. Zadanie 2. Szyfr Cezara. Zadanie 3. Czy liczba jest doskonała. Zadanie 4. Rozkład liczby na czynniki pierwsze Zadanie 5.

Strategia "dziel i zwyciężaj"

Wstęp do programowania

Raport z projektu. Przedmiot: Algorytmy i struktury danych 1 Projekt: Wieża Hanoi Autor: Wojciech Topolski

Metody algortmiczne (Algorytmy Część IV)

Programowanie dynamiczne

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

O rekurencji i nie tylko

Pendolinem z równaniami, nierównościami i układami

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

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

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

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

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

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

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

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Przeglad podstawowych pojęć (3) Podstawy informatyki (3) dr inż. Sebastian Pluta. Instytut Informatyki Teoretycznej i Stosowanej

2.8. Algorytmy, schematy, programy

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Luty 2001 Algorytmy (7) 2000/2001

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

CIĄGI wiadomości podstawowe

Rozwiązywanie układów równań liniowych metody dokładne Materiały pomocnicze do ćwiczeń z metod numerycznych

UKŁADY RÓWNAŃ LINIOWYCH - Metody dokładne

EGZAMIN MATURALNY 2012 INFORMATYKA

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

5. Rekurencja. Przykłady

Macierze. Rozdział Działania na macierzach

Jeszcze o algorytmach

Analiza algorytmów zadania podstawowe

Rozdział 5. Macierze. a 11 a a 1m a 21 a a 2m... a n1 a n2... a nm

Całka nieoznaczona, podstawowe wiadomości

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

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

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

UKŁADY RÓWNAŃ LINIOWYCH -Metody dokładne

Microsoft EXCEL SOLVER

Obliczenia iteracyjne

Projektowanie algorytmów rekurencyjnych

Zaawansowane algorytmy i struktury danych

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

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Matematyka dyskretna

Przykładowe zadania z teorii liczb

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

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.

1 Całki funkcji wymiernych

W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora.

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Podstawy Informatyki. Sprawność algorytmów

Rozwiązywanie zależności rekurencyjnych metodą równania charakterystycznego

ZADANIE 1. Ważenie (14 pkt)

Czas pracy: 60 minut

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

Algorytm. a programowanie -

Funkcja kwadratowa. f(x) = ax 2 + bx + c,

Algorytmy i struktury danych

Złożoność algorytmów. Wstęp do Informatyki

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Algorytmika i pseudoprogramowanie

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Ciągi i rekurencja, komputer dla matematyka. warsztaty towarzyszące konferencji Informatyka realnie prowadzą: Hanna Basaj Jan Aleksander Wierzbicki

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

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

Zapisywanie algorytmów w języku programowania

Programowanie komputerowe. Zajęcia 3

Funkcje wymierne. Funkcja homograficzna. Równania i nierówności wymierne.

Wielomiany. XX LO (wrzesień 2016) Matematyka elementarna Temat #2 1 / 1

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

Technologie informacyjne Wykład VII-IX

PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW

Wstęp do metod numerycznych Eliminacja Gaussa Równania macierzowe. P. F. Góra

UKŁADY RÓWNAŃ LINIOWYCH

Wykład 5. Metoda eliminacji Gaussa

5. Rozwiązywanie układów równań liniowych

Temat 20. Techniki algorytmiczne

Transkrypt:

Rekurencja Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów. Zgodnie ze znaczeniem informatycznym algorytm rekurencyjny to taki który korzysta z samego siebie, a program rekurencyjny to taki który wywołuje sam siebie. Cechy algorytmów rekurencyjnych: - zakończenie algorytmu jest jasno określone - złożony problem zostaje rozłożony na problem elementarny, który umiemy rozwiązać, i na problem o mniejszym stopniu komplikacji, niż ten z którym mieliśmy do czynienia na początku Przykład Mając tablicę n liczb całkowitych tab[1], tab[2],..., tab[n] stwierdzić czy w tablicy tab występuje liczba x, podana jako parametr. Rozwiązanie: 1) Wziąć pierwszy niezbadany element tablicy n-elementowej 2) Jeśli aktualnie analizowany element tablicy jest równy x to wypisać znaleziono x i zakończyć 3) W przeciwnym wypadku zbadać pozostałą n-1 elementową część tablicy korzystając z tego samego algorytmu 4) W przypadku zbadania całej tablicy i nie znalezienia elementu x wypisać nie znaleziono x

Schematycznie zapisany program, który rekurencyjnie realizuje to zadanie: lewy, prawy granice obszaru poszukiwań tab przeszukiwana tablica x poszukiwana liczba funkcja szukaj (tab, lewy, prawy, x) Jeśli (lewy >prawy) to Wypisz Element x nie został znaleziony w przeciwnym wypadku Jeśli ( tab[lewy] = x ) to Wypisz Znalazłem szukany element x KONIEC w przeciwnym przypadku szukaj(tab, lewy+1, prawy, x) wywołanie programu przez samego siebie Zakończenie powyższego algorytmu/programu jest jasno określone: - element znaleziony lub - przekroczenie zakresu tablicy Złożony problem zostaje rozbity na problem elementarny i na analogiczny problem tylko o mniejszym stopniu skomplikowania: - z tablicy o rozmiarze n schodzimy do tablicy o rozmiarze n-1 Podstawowe błędy przy konstruowaniu programów rekurencyjnych: - złe określenie warunku zakończenia programu - niewłaściwa, nieefektywna metoda rozwiązania problemu

Typowym przykładem zastosowania rekurencji jest liczenie n! zdefiniowanej jako: n! = n*(n-1)! gdy n>=1 n! = 1 gdy n=0 Program rekurencyjny liczący wielkość n! może wyglądać następująco: funkcja silnia(n) Jeśli (n = 0) to silnia=1 w przeciwnym wypadku silnia=n*silnia(n-1) wywołanie samego siebie Schemat obliczeń dla n=3 - pionowe strzałki w dół oznaczają wywołania rekurencyjne, tzn. zagłębianie się programu z poziomu n na poziom n-1 itd. w celu dotarcia do przypadku elementarnego 0! - poziome strzałki oznaczają obliczanie wyników cząstkowych - ukośne strzałki prezentują proces przekazywania wyniku cząstkowego z poziomu niższego na wyższy

Schemat Hornera Schemat Hornera to bardzo powszechna metoda stosowana do rozwiązywania wielu zadań min. do znajdowania reprezentacji liczby w innych systemach liczenia. Rozważmy zadanie policzenia wartości wielomianu stopnia n: y = W n (x) = a 0 *x n + a 1 *x n-1 + a 2 *x n-2 +... + a n-1 *x + a n Najprostsze rozwiązanie iteracyjne polega na konstruowaniu wyrazów, które następnie dodajemy zgodnie ze wzorem przy czym przyjmujemy, że współczynniki tworzą wektor a(0), a(1),..., a(n).

Wielomian W n (x) można też zapisać inaczej zgodnie ze schematem Hornera: Y = W n (x) = = (a 0 *x n-1 + a 1 *x n-2 + a 2 *x n-3 +... + a n-1 )*x +a n = = W n-1 (x)*x + a n = = ((a 0 *x n-2 + a 1 *x n-3 + a 2 *x n-4 +... + a n-2 )*x+ a n-1 )*x +a n = = (W n-2 (x)*x + a n-1 )*x + a n = = (...(( a 0 *x+ a 1 )*x + a 2 )*x +... + a n-1 )*x +a n = = (...(( W 1 (x)*x + a 2 )*x +... + a n-1 )*x +a n Algorytm napisany zgodnie z tym schematem wyglądałby nieco inaczej niż poprzednia wersja.

Algorytm mimo tego, że zawiera wyrażenie y=y*x+a(i) nie jest w pełni algorytmem rekurencyjnym. Pełny zapis rekurencyjny: a 0 gdy n=0 W n (x) = W n (x)*x + a n gdy n 1 1) Wartość wielomianu stopnia n, W n (x) jest liczona z wyrażenia zawierającego wielomian o jeden stopień mniejszy W n-1 (x). 2) Dla n=0 podana jest wartość definiowanej wielkości a 0 i jest to warunek zakończenia rekurencji, dzięki któremu ciąg kolejnych odwołań do wielkości W k (x) ma swój koniec. Schemat rekurencji dla wielomianu W n (x) jest podobny do schematu dla silni ( n! ).

W schemacie rekurencyjnym wyróżniamy dwa etapy: 1) Wywołania rekurencyjne, które kończy skorzystanie z warunku zakończenia rekurencji. 2) Powrót do kolejnych wywołań, obejmujący wykonywanie właściwych obliczeń lub tylko wstawianie wyników z niższych poziomów. Realizacja algorytmu rekurencyjnego wymaga zapisania go w postaci procedury, która może wywoływać samą siebie. Procedura powinna zawierać parametr określający poziom rekurencji czyli stopień zagłębiania się wywołań.

Rekurencja Przykład: Wieże Hanoi Mamy trzy paliki A,B,C i pewną liczbę ( n ) krążków różnej wielkości z otworami. Krążki są nanizane na palik A w kolejności od największego do najmniejszego, największy znajduje się na dole. Naszym zadaniem jest przenieść wszystkie krążki z palika A na palik B, z wykorzystaniem jeśli to konieczne palika C, w taki sposó, że: - pojedynczy ruch polega na przeniesieniu jednego krążka między dwoma palikami - w żadnej chwili większy krążek nie może leżeć na krążku mniejszym Rozwiązanie: n=1 Na paliku A znajduje się jeden krążek, który przenosimy jednym ruchem na palik B.

n=2 Na paliku A są dwa krążki : krążek górny przenosimy na palik C, krążek dolny na B i krążek z C przenosimy na B - trzy ruchy.

n=3 Uproszczony zapis rozwiązania: 1. Przenieś n-1 górnych krążków z palika A na palik C, używając B. 2. Przenieś największy krążek z palika A na palik B. 3. Przenieś wszystkie krążki z palika C na palik B, używając A. Krok 2. Jest trywialny, a wykonalność kroków 1. i 3. wynika z faktu, że cały czas dysponujemy trzema palikami bo krążkiem największym nie należy się przejmować, gdyż dowolny inny krążek może być położony na nim. Zapis rekurencyjny: Krok 1. Jeśli n = 1 to przenieś krążek z palika początkowego ( A ) na palik docelowy ( B ) i zakończ algorytm dla n = 1. Krok 2. { Liczba krążków na paliku początkowym ( A ) jest większa od 1, n>1} 2a. Stosując ten algorytm przenieś n-1 krążków z palika początkowego ( A ) na palik pośredni ( C ), używając palika docelowego ( B ). 2b. Przenieś pozostały krążek z palika początkowego ( A ) na palik docelowy ( B ). 2c. Stosując ten algorytm, przenieś n-1 krążków z palika pośredniego ( C ) na docelowy ( B ), używając początkowego ( A ). W krokach 1 i 2b wykonujemy takie samo przeniesienia. Dlatego oznaczamy ogólnie przeniesienie krążka z palika X na palik Y

jako (X Y), a przeniesienie k krążków z X na Y oznaczając (k,x,y,z). Przy czym X,Y,Z oznaczają paliki: X- początkowy, Y docelowy, Z pośredni.

Możemy wtedy zapisać najbardziej ogólną wersję rekurencyjną dla wież Hanoi (n,a,b,c). Krok 1. Jeśli n=0, to nic nie rób i zakończ algorytm dla tego przypadku. Krok 2. { Gdy liczba krążków na paliku A jest większa od 0, n>0 }. 2a. Zastosuj ten algorytm dla (n-1,a,c,b). 2b. Przenieś pozostały krążek (A B). 2c. Zastosuj ten algorytm dla (n-1,c,b,a).