ITERACJA - powtórzenie

Slides:



Advertisements
Podobne prezentacje
Sortowanie przez scalanie
Advertisements

Rekurencja 1 Podprogram lub strukturę danych nazywamy rekurencyjną, (recursive subprogram, recursive data structure) jeżeli częściowo składa się z samej.
CIĄGI.
Systemy Sztucznej Inteligencji
Wykład 06 Metody Analizy Programów System Hoare
Wykład 6 Najkrótsza ścieżka w grafie z jednym źródłem
Programowanie I Rekurencja.
Języki programowania C++
VI Rachunek predykatów
Semafory Autorzy : Michał Winciorek Łukasz Jackowicz.
ALGORYTM Co to jest algorytm?
Iteracja, indukcja i rekurencja
Złożoność obliczeniowa
Matematyka Dyskretna, G.Mirkowska, PJWSTK
Materiały pochodzą z Platformy Edukacyjnej Portalu
Sprzężenie zwrotne Patryk Sobczyk.
Lingwistyka Matematyczna
Liczby Pierwsze - algorytmy
ALGEBRA ZBIORÓW.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Rekurencja Copyright, 2000 © Jerzy R. Nawrocki Wprowadzenie do informatyki Wykład.
Rekurencja Copyright, 2001 © Jerzy R. Nawrocki Wprowadzenie do informatyki Wykład.
Materiały pomocnicze do wykładu
Elementy kombinatoryki
12 grudnia 2001Matematyka Dyskretna, Elementy Kombinatoryki G.Mirkowska, PJWSTK 1 Wykład 11 Elementy Kombinatoryki.
SZTUCZNA INTELIGENCJA ARTIFICIAL INTELLIGENCE
LICZBY RZECZYWISTE PODZBIORY ZBIORU LICZB RZECZYWISTYCH
Logo Komeniusz Gimnazjum w Tęgoborzy Mgr Zofia Czech.
ALGORYTMY KLASYCZNE ________ FRAKTALE
Funkcje w Pascalu Przypomnienie wiadomości o procedurach Prowadzący: Anna Kaleta Piotr Chojnacki.
Instrukcje sterujące część 2
Warsztaty programowania w języku Python
Przegląd podstawowych algorytmów
Gramatyki Lindenmayera
Paradoksy logiczne i inne 4 marca 2010.
Nie taki diabeł straszny czyli o zadaniach: wykaż , uzasadnij , udowodnij Piotr Ludwikowski.
Warsztaty programowania w języku Python
Języki i automaty część 3.
Rachunki Gentzena Joanna Witoch.
Instrukcje iteracyjne
ALGORYTMY Co to jest algorytm ? Cechy algorytmu Budowa algorytmów
Program Logomocja.
Obliczalność czyli co da się policzyć i jak Model obliczeń maszyna licznikowa dr Kamila Barylska.
Gramatyki Lindenmayera
Logomocja - podstawowe polecenia języka Logo
Derekursywacja i optymalizacja kodu
Zbiory Co to jest zbiór? Nie martw się, jeśli nie potrafisz odpowiedzieć. Nie ma odpowiedzi na to pytanie.
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
KNW- Wykład 3 Powtórzenie. PROGRAM WYKŁADU NR 3 Przykładowe zadania z logiki Modele możliwych światów.
Algorytmy- Wprowadzenie do programowania
Mikroekonomia A Ćwiczenia nr 2 pochodne.
Rekurencja.
Algorytmy.
Wstęp do Podstawy Programowania
Rozwiązanie zagadki nr 2
Pętle Zajęcia 6.
Autor: Michał Salewski
Rozdział IV Wyrażenia proceduralne algorytmów Grzegorz Gacek Patryk Gajewski.
Pętle – instrukcje powtórzeń
Wstęp do programowania Wykład 1
Wstęp do programowania Wykład 10 Programowanie w logice.
KNW - wykład 3 LOGIKA MODALNA.
Gramatyki Lindenmayera Powstanie Deterministyczny L-system.
czyli geometria (i nie tylko) w sztuce. Fraktale w Logo Komeniuszu
Liczbami naturalnymi nazywamy liczby 0,1,2,3,..., 127,... Liczby naturalne poznaliśmy już wcześniej; służą one do liczenia przedmiotów. Zbiór liczb.
Sposoby zapisu algorytmu
Procedury własne to procedury tworzone przez użytkownika, składające się z nagłówka, który zawiera słowa oto i nazwę procedury z parametrem, treści procedury.
Twierdzenie odwrotne do twierdzenia Pitagorasa.
Programowanie I Rekurencja.
Zapis prezentacji:

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ą.

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.

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 ............

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..

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!

Żółw reaguje na polecenia: naprzód do.tyłu w.prawo w.lewo

spirala(bok,kąt,przyrost,warunek) naprzód bok w.prawo kąt if(kąt<warunek) spirala(bok,kąt+przyrost,przyrost,warunek)

spirala(bok,kąt,przyrost,warunek) naprzód bok w.prawo kąt if(kąt<warunek) spirala(bok,kąt+przyrost,przyrost,warunek)

spirala(bok,kąt,przyrost,warunek) naprzód bok w.prawo kąt if(kąt<warunek) spirala(bok,kąt+przyrost,przyrost,warunek)

spirala(bok,kąt,warunek) naprzód bok w.prawo kąt jeżeli(bok<warunek) spirala(bok+3,kąt,warunek)

spirala(bok,kąt,warunek) naprzód bok w.prawo kąt jeżeli(bok<warunek) spirala(bok+3,kąt,warunek)

spirala(bok,kąt,warunek) naprzód bok w.prawo kąt jeżeli(bok<warunek) spirala(bok+3,kąt,warunek)

c(wielkość,stopień) jeżeli(stipień=0) naprzód wielkość zwróć C(wielkość,stopień-1) w.prawo 90 w.lewo 90

c(wielkość,stopień) jeżeli(stipień=0) naprzód wielkość zwróć C(wielkość,stopień-1) w.prawo 90 w.lewo 90

c(wielkość,stopień) jeżeli(stipień=0) naprzód wielkość zwróć C(wielkość,stopień-1) w.prawo 90 w.lewo 90

Krzywa Hilberta (krzywa wypełniająca przestrzeń) Łączymy 4 Łączymy 4 Łączymy 4 Łączymy 4 ....

Jaki jest algorytm rysowania krzywej Hilberta? Otrzymujemy Jaki jest algorytm rysowania krzywej Hilberta?

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

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?

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.

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.

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.

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.

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 C na palik A. Przenieś 3-ci krążek na palik B Przenieś 2 górne krążki z palika C na palik B.

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.

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)

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.

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); }

(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); }

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?

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.

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!

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.

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 2692537