Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
ITERACJA - powtórzenie
Rozważmy pętle ,,dopóki”: Dopóki g, wykonuj S Oznacza to: (*) Sprawdź, czy warunek g jest prawdziwy. Jeżeli warunek g jest prawdziwy, to wykonaj to wszystko co mówi S, a następnie wróć do (*). W przeciwnym przypadku pomiń S i przejdź dalej do tego co występuje za pętlą w głownym programie. g - warunek dozoru pętli, S – treść pętli. Wykonanie kroków S nazywamy przebiegiem pętli lub iteracją.
2
REKURENCJA Rekursja albo rekurencja (ang. recursion, z łac. recurrere, przybiec z powrotem) to w logice, programowaniu i w matematyce odwoływanie się (np. procedury lub definicji) do samej siebie. Można powiedzieć, że obiekt jest rekurencyjny jeżeli częściowo składa się z siebie samego lub jego definicja odwołuje się do jego samego.
3
W logice wnioskowanie rekurencyjne opiera się na założeniu istnienia pewnego stanu początkowego oraz zdania (lub zdań) stanowiącego podstawę wnioskowania. Istotą rekurencji jest tożsamość dziedziny i przeciwdziedziny reguły wnioskowania, wskutek czego wynik wnioskowania może podlegać tej samej regule zastosowanej ponownie. Podstawa wnioskowania Podstawa wnioskowania Stan początkowy Wniosek
4
Przykład: reguła: każdy ojciec jest starszy od swojego syna; każdy ojciec jest czyimś synem stan początkowy: jestem 22-letnim mężczyzną teza: ojciec ojca mojego ojca jest starszy ode mnie dowód: mój ojciec jest starszy ode mnie mój ojciec jest czyimś synem ojciec mojego ojca jest starszy od mojego ojca ojciec mojego ojca jest czyimś synem itd..
5
W praktyce często spotykamy się z definicją rekursyjną (rekursywną), która polega na wstępnym określeniu szczególnego podzbioru definiowanych obiektów (P), a obiektów pozostałych, w stosunku do obiektów zdefiniowanych wcześniej (R). Przykład Definicja liczb naturalnych: (P) 1 jest liczbą naturalną. (R) następnik liczby naturalnej jest liczbą naturalną. Rekurencja może prowadzić do powstania bardzo ciekawych obiektów!
6
Żółw reaguje na polecenia:
naprzód do.tyłu w.prawo w.lewo
7
spirala(bok,kąt,przyrost,warunek)
naprzód bok w.prawo kąt if(kąt<warunek) spirala(bok,kąt+przyrost,przyrost,warunek)
8
spirala(bok,kąt,przyrost,warunek)
naprzód bok w.prawo kąt if(kąt<warunek) spirala(bok,kąt+przyrost,przyrost,warunek)
9
spirala(bok,kąt,przyrost,warunek)
naprzód bok w.prawo kąt if(kąt<warunek) spirala(bok,kąt+przyrost,przyrost,warunek)
10
spirala(bok,kąt,warunek)
naprzód bok w.prawo kąt jeżeli(bok<warunek) spirala(bok+3,kąt,warunek)
11
spirala(bok,kąt,warunek)
naprzód bok w.prawo kąt jeżeli(bok<warunek) spirala(bok+3,kąt,warunek)
12
spirala(bok,kąt,warunek)
naprzód bok w.prawo kąt jeżeli(bok<warunek) spirala(bok+3,kąt,warunek)
13
c(wielkość,stopień) jeżeli(stipień=0) naprzód wielkość zwróć C(wielkość,stopień-1) w.prawo 90 w.lewo 90
14
c(wielkość,stopień) jeżeli(stipień=0) naprzód wielkość zwróć C(wielkość,stopień-1) w.prawo 90 w.lewo 90
15
c(wielkość,stopień) jeżeli(stipień=0) naprzód wielkość zwróć C(wielkość,stopień-1) w.prawo 90 w.lewo 90
16
Krzywa Hilberta (krzywa wypełniająca przestrzeń)
Łączymy 4 Łączymy 4 Łączymy 4 Łączymy 4 ....
17
Jaki jest algorytm rysowania krzywej Hilberta?
Otrzymujemy Jaki jest algorytm rysowania krzywej Hilberta?
18
Wieże Hanoi Zadanie polega na przeniesieniu wieży na inny pal, z zachowaniem następujących reguł: jednorazowo można przenosić tylko jeden krążek dopuszczalne jest umieszczanie tylko mniejszego krążka na większym
19
Kiedy nastąpi koniec świata według legendy?
Legenda mówi, że mnisi w pewnym klasztorze buddyjskim bez wytchnienia układają wieżę z 64 krążków. Kiedy skończą nastąpi koniec świata. Kiedy nastąpi koniec świata według legendy?
20
Dane są trzy paliki: A, B i C. Na jeden z nich, np
Dane są trzy paliki: A, B i C. Na jeden z nich, np. na A nałożono krążki o różnych średnicach, tak że krążek mniejszy nie leży pod większym. Paliki B i C sa puste. Należy przenieść wszystkie krążki z pala A na B. Można używać C jako pomocnicze miejsce przechowywania. Nie można kłaść krążków większych na mniejsze.
21
Oznaczmy paliki przez A, B i C.
Niech n oznacza liczbę krążków. Ponumerujmy krążki od najmniejszego u góry do najmniejszego u dołu. W celu przeniesienia krążków z A do B należy: Przenieś (n-1) górnych krążków z palika źródłowego na palik pośredni. przenieś n-ty krążek na palik docelowy przenieś (n-1) górnych krążków z palika pośredniego na palik docelowy.
22
Chcemy przenieść 3 krążki z palika A na palik B.
Przenieś 2 górne krążki z palika A na palik C. Przenieś 3-ci krążek na palik B Przenieś 2 górne krążki z palika C na palik B. Przenieś 1 górny krążek z palika A na palik B. Przenieś 2-gi krążek na palik C Przenieś 1 górny krążek z palika B na palik C.
23
Przenieś 1 górny krążek z palika A na palik B.
Przenieś 2-gi krążek na palik C Przenieś 1 górny krążek z palika B na palik C.
24
Przenieś 2 górne krążki z palika A na palik C.
Przenieś 3-ci krążek na palik B Przenieś 2 górne krążki z palika C na palik B.
25
Przenieś 1 górny krążek z palika C na palik A.
Przenieś 3-ci krążek na palik B Przenieś 2 górne krążki z palika C na palik B.
26
A®B A®C B®C A®B C®A C®B A®B
Oznaczmy przez X®Y czynność przenoszenia krążka z położenia X do położenia Y. Zadanie, które wykonaliśmy można zapisać następująco: A®B A®C B®C A®B C®A C®B A®B Dane wejściowe do algorytmu to liczba krążków n, a danymi wyjściowymi jest lista ruchów X®Y , które należy wykonać aby rozwiązać zadanie. Lista ruchów dla n=3 wygląda tak jak powyżej.
27
Stos - liniowa struktura danych
Stos - liniowa struktura danych. Dane dokładane są na wierzch stosu, również z wierzchołka są ściągane (stosuje się też określenie LIFO (ang. Last In First Out), oddające tę samą zasadę). Przykład: stos książek Operacje, jakie można wykonywać na stosie: PUSH - czyli odłożenie obiektu na stos; rozmiar stosu zwiększa się o 1. Jeżeli przekroczony zostaje maksymalny rozmiar stosu następuje jego przepełnienie (ang. stack overflow). POP - ściągnięcie obiektu ze stosu; może doprowadzić do niedopełnienia stosu (ang. stack underflow). Przeciwieństwem stosu LIFO jest kolejka, bufor typu FIFO (ang. First In, First Out)
28
Definicje rekurencyjne ciągów
Mówimy, że ciąg jest zdefiniowany rekurencyjnie, jeżeli: (P) Określony jest pewien skończony zbiór wyrazów ciągu, zazwyczaj kilka pierwszych lub pierwszy wyraz. (R) Pozostałe wyrazy ciągu są zdefiniowane za pomocą poprzednich wyrazów ciągu.
29
można zdefiniować następująco: (P) CIĄG(0)=CIĄG(1)=0
Przykład: Ciąg 0, 0, 1, 1, 2, 2, 3, 3,.... można zdefiniować następująco: (P) CIĄG(0)=CIĄG(1)=0 (R) CIĄG(n)=1+CIĄG(n-2) dla n>=2 Rekurencja int ciag(int n) { if(n<2) return 0; else return 1+ciag(n-2); }
30
(R) SILNIA(n)=SILNIA(n-1)*n dla n>0
Przykład: Silnia (P) SILNIA(0)=1 (R) SILNIA(n)=SILNIA(n-1)*n dla n>0 1, 1, 2, 6, 24, 120,...... Iteracja Rekurencja int silnia(int n) { if (n =< 1) return 1; else int silnia=1; for(int i=2;i<=n;i++) silnia=silnia*i; } return silnia; int silnia(int n) { if (n =< 1) return 1; else return n*silnia(n-1); }
31
Przykład: Ciąg Fibonacciego
(P) FIB(0)=0, FIB(1)=1 (R) FIB(n)=FIB(n-1)+FIB(n-2) dla n>1 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,...... Rekurencja int fib(int n) { if(n<2) return n; else return fib(n-1)+fib(n-2); } Czy to jest dobre rozwiązanie?
32
Obliczenie wartości FIB(n) za pomocą wywołania funkcji fib(int n)
powoduje jej uaktywnienie. Jak często? Zauważmy, że każde wywołanie z n>1 powoduje dwa dalsze wywołania fib(n-1) oraz fib(n-2) 5 4 3 2 3 2 1 2 1 1 1 Obliczenia są nieefektywne bo funkcja fib(int n) jest wywolywana 25 razy dla obliczenia 7-go elementu.
33
Czy można policzyć to prościej?
Iteracja Rekurencja int fib(int n) { if(n<2) return n; else int z,x=1,y=0; for(int i=0;i<n;i++) z=x; x+=y; y=z; } return y; int fib(int n) { if(n<2) return n; else return fib(n-1)+fib(n-2); } Można pokazać ze liczba wywołań funkcji fib() jest 2*fib(n+1)-1 w celu obliczenia wartości Fib(n). W metodzie iteracyjnej unikamy obliczania tych samych wartości!
34
Czas działania algorytmów
Niech f i g będą ciągami liczb rzeczywistych. Piszemy f(n)=O(g(n)) (czytamy f(n) jest O od g(n)) wtedy gdy istnieje stała dodatnia taka, że |f(n)|<=C|g(n)| (dla pewnej liczby małych wartości n nierówność ta nie musi być spełniona – zależy nam na dużych wartościach n) Twierdzenie Każdy z powyższych ciągów jest O od wszystkich ciągów na prawo od niego.
35
Algorytm rekurencyjny
Z poniższej tabeli widać, że algorytm rekurencyjny jest typu O(2n). Algorytm iteracyjny jest typu O(n). n Przypisania Algorytm iteracyjny Algorytm rekurencyjny 6 15 25 10 27 177 42 1973 20 57 21891 72 242785 30 87
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.