Algorytmy i Struktury Danych.

Podobne dokumenty
Podstawy Informatyki

Wstęp do Informatyki

Algorytmy i Struktury Danych.

Rekurencja. Przygotowała: Agnieszka Reiter

FRAKTALE. nie tworzą się z przypadku. Są tworzone naturalnie przez otaczającą nas przyrodę, bądź za pomocą

Ciągi liczbowe. - oznacza, że a(1) = a 1, a(2) = a 2, a(n) = a n a 1, a 2, a 3, a 4,... a n a(n) a n

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

FRAKTALE I SAMOPODOBIEŃSTWO

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

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

Wstęp do Informatyki

5. Rekurencja. Przykłady

Ciąg Fibonacciego jako szczególny przykład ciągu określonego rekurencyjnie. Przykłady rekurencji w informatyce

Projekt współfinansowany przez Unię Europejską ze środków Europejskiego Funduszu Społecznego

Modele i symulacje - Scratch i Excel

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Fraktale. i Rachunek Prawdopodobieństwa

ALGORYTMY I STRUKTURY DANYCH

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

Podstawy algorytmiki i programowania - wykład 3 Funkcje rekurencyjne Wyszukiwanie liniowe i binarne w tablicy

Fraktale wokół nas. Leszek Rudak Uniwersytet Warszawski. informatyka +

Programowanie Proceduralne

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

Fraktale deterministyczne i stochastyczne. Katarzyna Weron Katedra Fizyki Teoretycznej

Obrazy rekurencyjne. Zastosowanie rekurencji w algorytmice. AUTOR: Martin Śniegoń

Rekurencja (rekursja)

Jezyki i metody programowania

Programowanie - wykład 4

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

Zbiór Cantora. Diabelskie schody.

Wstęp do Informatyki

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

samopodobnym nieskończenie subtelny

Technologie Informatyczne Wykład VII

Technologie informacyjne Wykład VII-IX

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

Liczby całkowite i rzeczywiste

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Złota liczba. Zajęcia matematyczno przyrodnicze w Szkole Podstawowej w Antolce

Programowanie komputerowe. Zajęcia 3

Sierpiński Carpet Project. W ZSTiL Zespół Szkół Technicznych i Licealnych

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

Programowanie obiektowe i C++ dla matematyków

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

Wstęp do programowania

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Wstęp do programowania

Wstęp do programowania

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

Zadania domowe. Ćwiczenie 2. Rysowanie obiektów 2-D przy pomocy tworów pierwotnych biblioteki graficznej OpenGL

Wstęp do programowania

Wstęp do informatyki

Algorytmy i Struktury Danych

3. Instrukcje warunkowe

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

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie Procedurale

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

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Projektowanie algorytmów rekurencyjnych

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

Wstęp do programowania

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Obliczenia inspirowane Naturą

Programowanie komputerowe. Zajęcia 2

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

Modele i symulacje - Scratch i Excel

Metody algortmiczne (Algorytmy Część IV)

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

Algorytmy. wer Wojciech Myszka 30 listopada 2008

FILO MATH ZESPÓŁ SZKÓŁ OGÓLNOKSZTAŁCĄCYCH GAZETKA KOŁA MATEMATYCZNEGO CO W NUMERZE: PRZEGLĄD MATEMATYKÓW. W KAMIENNEJ GÓRZE

Algorytmy i struktury danych

Programowanie w Baltie klasa VII

Krzywa uniwersalna Sierpińskiego

WYMAGANIA EDUKACYJNE Z MATEMATYKI KLASA I GIMNAZJUM Małgorzata Janik

Wstęp do Programowania 2

Wstęp do Programowania 2

Funkcje i tablice. Elwira Wachowicz. 23 maja 2013

Systemy Lindenmayera (L-systemy)

Wstęp do programowania

2.8. Algorytmy, schematy, programy

INTERAKTYWNA KOMUNIKACJA WIZUALNA. Systemy Lindenmayera (L-systemy)

Podstawy programowania. Podstawy C# Przykłady algorytmów

Plan prezentacji. Cechy charakterystyczne fraktali Zastosowanie fraktali Wymiar fraktalny D. Iteracyjny system funkcji (IFS)

Zaawansowane algorytmy i struktury danych

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Algorytmy, reprezentacja algorytmów.

WHILE (wyrażenie) instrukcja;

Podstawy Programowania

Metody numeryczne w przykładach

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Ciągi liczbowe wykład 3

Algorytmy i Struktury Danych.

Algorytmy i język C++

Algorytm. a programowanie -

Programowanie Obiektowe i C++

Fraktale w matematyce

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI STYCZEŃ POZIOM ROZSZERZONY Część I

Transkrypt:

Algorytmy i Struktury Danych. Rekurencja dr hab. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 1 / 47

Rekurencja Rekurencja albo rekursja (ang. recursion, z łac. recurrere, przybiec z powrotem) to w matematyce i informatyce (np. programowaniu) odwoływanie się np. definicji lub funkcji czy procedury do samej siebie. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 2 / 47

Rekurencja Rekurencja albo rekursja (ang. recursion, z łac. recurrere, przybiec z powrotem) to w matematyce i informatyce (np. programowaniu) odwoływanie się np. definicji lub funkcji czy procedury do samej siebie. Rekurencyjny - mat. dajacy się wyrazić za pomoca wielkości uprzednio znanych; wzór rekurencyjny - wzór pozwalajacy obliczyć wyrazy ciagu na podstawie jednego lub kilku wyrazów poprzedzajacych. <ang. recurrent, fr. recurrent, z łac. recurrens powracajacy >. [Słownik Wyrazów Obcych, PWN, 1996] Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 2 / 47

Rekurencja Rekurencja polega na rozwiazywaniu problemu w oparciu o rozwiazania tego samego problemu dla danych o mniejszych rozmiarach. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Rekurencja Rekurencja polega na rozwiazywaniu problemu w oparciu o rozwiazania tego samego problemu dla danych o mniejszych rozmiarach. W informatyce rekurencja jest technika programistyczna, polegajac a na wywoływaniu funkcji wewnatrz niej samej. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Rekurencja Rekurencja polega na rozwiazywaniu problemu w oparciu o rozwiazania tego samego problemu dla danych o mniejszych rozmiarach. W informatyce rekurencja jest technika programistyczna, polegajac a na wywoływaniu funkcji wewnatrz niej samej. Rekurencja jest jedna z najbardziej interesujacych technik programistycznych i to w dodatku technika zaskakujaco efektywna. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Rekurencja Rekurencja polega na rozwiazywaniu problemu w oparciu o rozwiazania tego samego problemu dla danych o mniejszych rozmiarach. W informatyce rekurencja jest technika programistyczna, polegajac a na wywoływaniu funkcji wewnatrz niej samej. Rekurencja jest jedna z najbardziej interesujacych technik programistycznych i to w dodatku technika zaskakujaco efektywna. Rekurencyjny opis obliczeń jest na ogół bardziej zwarty niż opis tych samych obliczeń bez użycia rekurencji. Taki opis jest stosowany np. przy opisie fraktali. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Rekurencja Rekurencja polega na rozwiazywaniu problemu w oparciu o rozwiazania tego samego problemu dla danych o mniejszych rozmiarach. W informatyce rekurencja jest technika programistyczna, polegajac a na wywoływaniu funkcji wewnatrz niej samej. Rekurencja jest jedna z najbardziej interesujacych technik programistycznych i to w dodatku technika zaskakujaco efektywna. Rekurencyjny opis obliczeń jest na ogół bardziej zwarty niż opis tych samych obliczeń bez użycia rekurencji. Taki opis jest stosowany np. przy opisie fraktali. Niektóre rozwiazania rekurencyjne moga być nieefektywne. W takich przypadkach można je zastapić rozwiazaniami wykorzystujacymi zwyczajna petle lub stos. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Czym jest fraktal? Fraktalem jest wszystko... Benoit Mandelbrot Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 4 / 47

Czym jest fraktal? Fraktalem jest wszystko... Benoit Mandelbrot Fraktal jest figura geometryczna o złożonej strukturze, nie będaca krzywa, powierzchnia ani bryła w rozumieniu klasycznej matematyki; charakteryzuje ja ułamkowy wymiar (stad nazwa fraktal -ang. fraction ułamek, łac. fractus złamany). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 4 / 47

Czym jest fraktal? Fraktalem jest wszystko... Benoit Mandelbrot Fraktal jest figura geometryczna o złożonej strukturze, nie będaca krzywa, powierzchnia ani bryła w rozumieniu klasycznej matematyki; charakteryzuje ja ułamkowy wymiar (stad nazwa fraktal -ang. fraction ułamek, łac. fractus złamany). Fraktale sa bardzo skomplikowane, toteż dopiero komputery umożliwiły ich głębsze poznanie. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 4 / 47

Czym jest fraktal? Fraktalem jest wszystko... Benoit Mandelbrot Fraktal jest figura geometryczna o złożonej strukturze, nie będaca krzywa, powierzchnia ani bryła w rozumieniu klasycznej matematyki; charakteryzuje ja ułamkowy wymiar (stad nazwa fraktal -ang. fraction ułamek, łac. fractus złamany). Fraktale sa bardzo skomplikowane, toteż dopiero komputery umożliwiły ich głębsze poznanie. Wielu badaczy twierdzi, że geometria fraktali jest geometria przyrody. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 4 / 47

Czym jest fraktal? Fraktalem jest wszystko... Benoit Mandelbrot Fraktal jest figura geometryczna o złożonej strukturze, nie będaca krzywa, powierzchnia ani bryła w rozumieniu klasycznej matematyki; charakteryzuje ja ułamkowy wymiar (stad nazwa fraktal -ang. fraction ułamek, łac. fractus złamany). Fraktale sa bardzo skomplikowane, toteż dopiero komputery umożliwiły ich głębsze poznanie. Wielu badaczy twierdzi, że geometria fraktali jest geometria przyrody. Fraktale dały poczatek nowej geometrii zwanej geometria fraktalna, która pozwala modelować wiele obiektów i zjawisk występujacych w przyrodzie i nie tylko... Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 4 / 47

Fraktale Najstarsze fraktale wymyślili matematycy na poczatku XX-wieku, w wyniku zmagań z definicja wymiaru i krzywej. Najwybitniejszym twórca fraktali jest amerykański matematyk i informatyk polskiego pochodzenia - Benoit Mandelbrot. Na międzynarodowym kongresie matematyków w Warszawie w roku 1983 stwierdził, że jest jeszcze za wcześnie na formułowanie ścisłej definicji fraktala ponieważ nie znamy dostatecznie głęboko istoty tego pojęcia. Źródło: http://en. wikipedia.org/wiki/ Benoit_Mandelbrot Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 5 / 47

Cechy fraktali Fraktale maja cechę samopodobieństwa. Nie sa określone wzorem matematycznym, tylko zależnościa rekurencyjna. Sa obiektami których wymiar nie jest liczba całkowita. Każdy fraktal można w nieskończoność przybliżać. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 6 / 47

Cechy fraktali Fraktale maja cechę samopodobieństwa. Nie sa określone wzorem matematycznym, tylko zależnościa rekurencyjna. Sa obiektami których wymiar nie jest liczba całkowita. Każdy fraktal można w nieskończoność przybliżać. Kalafior Brokuł Drzewo Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 6 / 47

Fraktale - Zbiór Cantora Pierwsze fraktale powstały na przełomie XIX i XX wieku. Ich twórcami byli matematycy: Georg Cantor, David Hilbert, Helge von Koch oraz Wacław Sierpiński. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 7 / 47

Fraktale - Zbiór Cantora Pierwsze fraktale powstały na przełomie XIX i XX wieku. Ich twórcami byli matematycy: Georg Cantor, David Hilbert, Helge von Koch oraz Wacław Sierpiński. W roku 1883 Georg Cantor zaproponował prosta konstrukcję, w wyniku której otrzymuje się zbiór nazwany jego imieniem. Konstrukacja: Odcinek [0, 1] dzielimy na trzy równe części i usuwamy środkowa. Z pozostałymi dwoma odcinkami postępujemy analogicznie. W konsekwencji takiego postępowania w granicy nieskończonej ilości kroków powstaje zbiór punktów Cantora. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 7 / 47

Fraktale - Zbiór Cantora Pierwsze fraktale powstały na przełomie XIX i XX wieku. Ich twórcami byli matematycy: Georg Cantor, David Hilbert, Helge von Koch oraz Wacław Sierpiński. W roku 1883 Georg Cantor zaproponował prosta konstrukcję, w wyniku której otrzymuje się zbiór nazwany jego imieniem. Konstrukacja: Odcinek [0, 1] dzielimy na trzy równe części i usuwamy środkowa. Z pozostałymi dwoma odcinkami postępujemy analogicznie. W konsekwencji takiego postępowania w granicy nieskończonej ilości kroków powstaje zbiór punktów Cantora. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 7 / 47

Fraktale - Krzywa Kocha W 1904 roku szwedzki matematyk Helge von Koch zaproponował konstrukcję nazywana potocznie płatkiem śniegu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 8 / 47

Fraktale - Krzywa Kocha 1 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 9 / 47

Fraktale - Krzywa Kocha 1 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 9 / 47

Fraktale - Krzywa Kocha 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 10 / 47

Fraktale - Krzywa Kocha 3 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 10 / 47

Fraktale - Krzywa Kocha 0) 1) 2) 3) 4) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 11 / 47

Fraktale - Wacław Sierpiński W 1916 roku Wacław Sierpiński (14.03.1882-21.10.1969) rozszerzył zbiór Cantora na dwa wymiary. Kwadrat jednostkowy dzielimy na dziewięć i wyrzucamy środkowy. Postępujemy tak z każdym nowo powstałym kwadratem. Powstały fraktal nazywany dywanem Sierpińskiego. Analogicznie można postapić z trójkatem, którego boki dzielimy na dwie części i powstałe punkty łaczymy co doprowadzi do powstania kolejnego trójkata, który usuwamy. Z pozostałymi trzema postępujemy podobnie, itd. Źródło:http: //www.gap-system. org/~history/ Biographies/ Sierpinski.html Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 12 / 47

Fraktale - Trójkat Sierpińskiego Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 13 / 47

Fraktale - Trójkat Sierpińskiego Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 14 / 47

Fraktale - Dywan Sierpińskiego Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 15 / 47

Fraktale - Krzywa Hilberta Krzywa Hilberta - to przykład krzywej, która wypełnia całkowicie płaszczyznę, tzn. przechodzi przez wszystkie punkty płaszczyzny. Konstrukcja tej krzywej została podana przez Davida Hilberta w 1891 jako wariant krzywej Peano. n = 1 n = 2 n = 3 n = 4 n = 5 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 16 / 47

Inne fraktale Zbiory Julii: F(0) = p; F(n + 1) = F(n) 2 + c; gdzie: p - punkt płaszczyzny c - liczba zespolona będaca parametrem zbioru. Dla różnych c otrzymujemy różne zbiory. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 17 / 47

Inne fraktale Zbiory Mandelbrota: F(0) = (0, 0); F(n + 1) = F(n) 2 + c; gdzie: c - liczba zespolona będaca parametrem zbioru. Dla różnych c otrzymujemy różne zbiory. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 18 / 47

Rekurencja - podstawowe informacje Metoda rekurencyjna cyklicznie wywołuje sama siebie, za każdym razem przekazujac w wywołaniu inne argumenty. Przekazanie argumentu o pewnej wartości powoduje, że metoda kończy działanie bez kolejnego wywołania samej siebie. Sytuacja ta jest nazywana przypadkiem bazowym. Gdy najbardziej wewnętrzne wywołanie metody zostaje zakończone, rozpoczyna się proces zakańczania kolejnych wywołań, który w końcu doprowadza do zakonczenia poczatkowego wywołania. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 19 / 47

Funkcja silnia n! = 1 2... n - wersja iteracyjna Require: Liczba n 1: i := 1; 2: silnia := 1; 3: while i <= n do 4: silnia := silnia * i; 5: i:= i+1; 6: end while 7: return silnia; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 20 / 47

Funkcja silnia n! = 1 2... n - kod C++ #include <iostream> using namespace std; long long silnia(int n){ if (n==0) return 1; int i = 1; long long s = 1; while (i <= n) s = s * i++; return s; } int main () { cout << "Podaj liczbe n = "; int n; cin >>n; long long m = silnia (n); cout << n << "! = " << m << endl; return 0; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 21 / 47

Rekurencja - funkcja silnia silnia(n) = { 1 dla n = 0 n silnia(n 1) dla n > 0 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 22 / 47

Rekurencja - funkcja silnia silnia(n) = { 1 dla n = 0 n silnia(n 1) dla n > 0 Jak to wyglada w praktyce dla n = 3 (silnia(3) =?) 1 n = 0? nie, zatem oblicz 3 silnia(2) 2 n = 0? nie, zatem oblicz 2 silnia(1) 3 n = 0? nie, zatem oblicz 1 silnia(0) 4 n = 0? tak, zwróć 1. 5 zwróć 1 1 6 zwróć 1 1 2 7 zwróć 1 1 2 3 8 Zatem silnia(3) = 6! Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 22 / 47

Funkcja silnia - wersja rekurencyjna - kod C++ #include <iostream> using namespace std; long long silnia(int n){ if (n==0) return 1; else return n*silnia(n-1); } int main(){ cout << "Podaj liczbe n = "; int n; cin >>n; long long m = silnia (n); cout << n << "! = " << m << endl; return 0; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 23 / 47

Liczby trójkatne Liczby trójkatne to ciag liczb: 1, 3, 6, 10, 15, 21,... (gdzie trzykropek oznacza, ciag jest nieskończony). n-ty element ciagu jest uzyskiwany poprzez dodanie liczby n do poprzedniego elementu ciagu. A zatem, drugi element ciagu to 2 plus wartość pierwszego elementu (czyli 1), co daje 3. Trzeci element ciagu to 3 plus 3 (wartość drugiego elementu), co daje 6; i tak dalej. Liczby trójkatne można przedstawić za pomoca odpowiedniej ilości obiektów (kulek, pudełek, itp.) rozmieszczonych w formie trójkata. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 24 / 47

Liczby trójkatne Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 25 / 47

Algorytm obliczajacy n-ta liczbę trójkatn a Algorytm: triangle (n) 1: if n< 1 then 2: return 0; 3: else 4: if n=1 then 5: return 1; 6: else 7: return n+ triangle(n - 1); 8: end if 9: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 26 / 47

Funkcja triangle - wersja nierekurencyjna - kod C++ #include <iostream> using namespace std; int triangle (int n) { int total = 0; while (n>0) { total = total +n; --n; } return total; } int main(){ cout << "Podaj liczbe n = "; int n; cin >> n; int m = triangle (n); cout << n <<"-ta liczba trojkatna: " << m << endl; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 27 / 47

Funkcja triangle - wersja rekurencyjna - kod C++ #include <iostream> using namespace std; int triangle (int n) { if (n< 1) return 0; else if (n==1) return 1; else return n+triangle(n-1); } int main(){ cout << "Podaj liczbe n = "; int n; cin >> n; int m = triangle (n); cout << n <<"-ta liczba trojkatna: " << m << endl; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 28 / 47

Rekurencja - obliczanie a n a n = pow(a, n) = { 1 dla n = 0 a pow(a, n 1) dla n > 0 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 29 / 47

Rekurencja - obliczanie a n a n = pow(a, n) = { 1 dla n = 0 a pow(a, n 1) dla n > 0 Jak to wyglada w praktyce dla a = 2 i n = 3 (pow(2, 3) =?) 1 n = 0? nie, zatem oblicz 2 pow(2, 2) 2 n = 0? nie, zatem oblicz 2 pow(2, 1) 3 n = 0? nie, zatem oblicz 2 pow(2, 0) 4 n = 0? tak, zwróć 1. 5 zwróć 1 2 6 zwróć 1 2 2 7 zwróć 1 2 2 2 8 Zatem pow(2, 3) = 8! Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 29 / 47

Funkcja pow - wersja rekurencyjna kod C++ #include <iostream> using namespace std; long long pow(int a, int n){ if (n==0) return 1; else return a*pow(a,n-1); } int main(){ cout << "Podaj liczby a i n = "; int n,a; cin >> a >> n; long long m = pow (a,n); cout << a << "^" << n << "=" << m << endl; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 30 / 47

Rekurencja - algorytm Euklidesa Dane: a, b - dwie liczby naturalne Dane wyjściowe: liczba naturalna będaca największym wspólnym dzielnikiem liczb a i b. Rozwiazanie rekurencyjne: { a dla b = 0 NWD(a, b) = NWD(b, a mod b) dla b > 0 Euklides z Aleksandrii ok. 365-300 p.n.e. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 31 / 47

Rekurencja - algorytm Euklidesa NWD(a, b) = { a dla b = 0 NWD(b, a mod b) dla b > 0 Przykład: NWD(1071, 1029) = NWD(1029, 1071mod1029 = 42) = NWD(1029, 42) = NWD(42, 1029mod42 = 21) = NWD(42, 21) = NWD(21, 42mod21 = 0). Stad: NWD(1071, 1029) = 21. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 32 / 47

Funkcja NWD - kod C++ #include <iostream> using namespace std; long long NWD(int a, int b){ if (b==0) return a; else return NWD(b,a%b); } int main(){ cout << "Podaj liczby a i b = "; int a,b; cin >> a >> b; long long m = NWD(a,b); cout << "NWD(" << a << "," << b << ")=" << m; cout << endl; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 33 / 47

Ciag Fibonacciego Liczby naturalne tworzace ciag o takiej własności, że kolejny wyraz (z wyjatkiem dwóch pierwszych) jest suma dwóch poprzednich nazywa się liczbami Fibonacciego. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 34 / 47

Ciag Fibonacciego Liczby naturalne tworzace ciag o takiej własności, że kolejny wyraz (z wyjatkiem dwóch pierwszych) jest suma dwóch poprzednich nazywa się liczbami Fibonacciego. Poczatkowe wartości tego ciagu to: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,... Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 34 / 47

Ciag Fibonacciego Liczby naturalne tworzace ciag o takiej własności, że kolejny wyraz (z wyjatkiem dwóch pierwszych) jest suma dwóch poprzednich nazywa się liczbami Fibonacciego. Poczatkowe wartości tego ciagu to: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,... Ciag Fibonacciego zawdzięcza swoja nazwę włoskiemu matematykowi z Pizy, Leonardowi, który pod nazwiskiem Fibonacci wydał w 1202 roku słynna księgę Liber Abaci zawierajac a opis tego ciagu jako rozwiazanie zadania o rozmnażaniu się królików. Ojciec Leonarda nosił przydomek Bonacci, stad syn został Fibonaccim (filius Bonacci - syn dobrotliwego). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 34 / 47

Ciag Fibonacciego - rozmnażanie królików Zadanie Fibonacciego: Ile par królików może spłodzić jedna para w ciagu roku, jeśli: każda para rodzi nowa parę w ciagu miesiaca, para staje się płodna po miesiacu, króliki nie umieraja. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 35 / 47

Ciag Fibonacciego - Złoty podział W wyniku podzielenia każdej z liczb ciagu przez jej poprzednik otrzymuje się iloraz oscylujacy wokół 1, 618 - liczby złotego podziału. W miarę zwiększania się liczb zmniejszaja się odchylenia od tej wartości. Dokładna wartość granicy jest złota liczba: 5 + 1 Φ = = 1, 6180339887498948482... 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 36 / 47

Ciag Fibonacciego - Złoty podział W wyniku podzielenia każdej z liczb ciagu przez jej poprzednik otrzymuje się iloraz oscylujacy wokół 1, 618 - liczby złotego podziału. W miarę zwiększania się liczb zmniejszaja się odchylenia od tej wartości. Dokładna wartość granicy jest złota liczba: 5 + 1 Φ = = 1, 6180339887498948482... 2... 233/144 = 1.61805555556 144/89 = 1.61797752809 89/55 = 1.61818181818 55/34 = 1.61764705882 34/21 = 1.61904761905 21/13 = 1.61538461538... Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 36 / 47

Ciag Fibonacciego - Złoty podział W wyniku podzielenia każdej z liczb ciagu przez jej następnik otrzymuje się iloraz oscylujacy wokół 0, 618 - liczby złotego podziału. W miarę zwiększania się liczb zmniejszaja się odchylenia od tej wartości. Dokładna wartość granicy jest złota liczba: 5 1 Φ = = 0, 618033989... 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 37 / 47

Ciag Fibonacciego - Złoty podział W wyniku podzielenia każdej z liczb ciagu przez jej następnik otrzymuje się iloraz oscylujacy wokół 0, 618 - liczby złotego podziału. W miarę zwiększania się liczb zmniejszaja się odchylenia od tej wartości. Dokładna wartość granicy jest złota liczba: 5 1 Φ = = 0, 618033989... 2... 144/233 = 0.618025751073 89/144 = 0.618055555556 55/89 = 0.61797752809 34/55 = 0.618181818182 21/34 = 0.617647058824 13/21 = 0.619047619048... Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 37 / 47

Ciag Fibonacciego - Złoty podział Złoty podział (łac. sectio aurea), podział harmoniczny, złota proporcja, boska proporcja (łac. divina proportio) - podział odcinka na dwie części tak, by stosunek długości dłuższej z nich do krótszej był taki sam, jak całego odcinka do części dłuższej. Φ = a + b a = a b Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 38 / 47

Ciag Fibonacciego - Złoty podział Złoty podział (łac. sectio aurea), podział harmoniczny, złota proporcja, boska proporcja (łac. divina proportio) - podział odcinka na dwie części tak, by stosunek długości dłuższej z nich do krótszej był taki sam, jak całego odcinka do części dłuższej. Φ = a + b a = a b Złotymi proporcjami wyznaczonymi na podstawie ciagu Fibonacciego posługiwał się w swoim malarstwie Leonardo da Vinci i Botticelli. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 38 / 47

Ciag Fibonacciego - gdzie go można znaleźć? Ciag Fibonacciego można odnaleźć w wielu aspektach przyrody, ciag taki opisuje np. liczbę pędów rośliny jednostajnie przyrastajacej w latach. W słoneczniku możemy zaobserwować dwa układy linii spiralnych, wychodzacych ze środka. Liczba linii rozwijajacych się zgodnie z ruchem wskazówek zegara wynosi 55 i tylko 34 skręconych w przeciwna stronę. Takie same spirale można zaobserwować na wielu innych roślinach (np. kalafior, ananas). Liczby spiral występujacych w tych roślinach sa kolejnymi liczbami Fibonacciego. Źródło: http://www.math.edu.pl/liczby-fibonacciego Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 39 / 47

Ciag Fibonacciego - algorytm rekurencyjny Ciag Fibonacciego definiujemy rekurencyjnie w sposób następujacy: F 0 = 0 F 1 = 1 F n = F n 1 + F n 2, dla n 2 Require: Liczba n {F 0,..., F n 1, F n } Algorytm: FIB (n) 1: if n < 2 then 2: return n; 3: else 4: return FIB(n 2) + FIB(n 1); 5: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 40 / 47

Ciag Fibonacciego - definicja rekurencyjna Definicja: F 0 = 0, F 1 = 1, F n = F n 1 + F n 2 dla n 2 F 5 F 4 F 3 F 2 F 3 F 2 F 1 F 1 F 0 F 2 F 1 F 1 F 0 F 1 F 0 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 41 / 47

Funkcja Fibonacci - kod C++ #include <iostream> using namespace std; long long Fibonacci(int n){ if (n < 2) return n; else return Fibonacci(n-2) + Fibonacci(n-1); } int main(){ cout << "Podaj liczbe n = "; int n; cin >> n; for (int i=0; i<=n ; i++) cout << Fibonacci(i) << "\t"; cout << endl; return 0; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 42 / 47

Ciag Fibonacciego - spirala 0 if n = 0 f (n) = 1 if n = 1 f (n 1) + f (n 2) if n 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 43 / 47

Efektywność rekurencyjnego wykonania funkcji Fibonacciego n Liczba dodawań Liczba wywołań 6 12 25 10 88 177 15 986 1 973 20 10 945 21 891 25 121 392 242 785 30 1 346 268 2 692 537 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 44 / 47

Ciag Fibonacciego - algorytm iteracyjny Require: Liczba n {F 0,..., F n 1, F n } Algorytm: FIB (n) 1: if n < 2 then 2: return n; 3: else 4: f 0 := 0; 5: f 1 := 1; 6: for i := 2 n do 7: m := f 0 + f 1; 8: f 0 := f 1; 9: f 1 := m; 10: end for 11: end if 12: return m; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 45 / 47

Funkcja Fibonacci - kod C++ #include <iostream> using namespace std; long long Fibonacci(int n){ if (n < 2) return n; else { long long f0=0,f1=1,m; for(int i=2; i<=n ; i++){ m = f0 + f1; f0 = f1; f1 = m; } return m; } } int main(){ cout << "Podaj liczbe n = "; int n; cin >> n; for (int i=0; i<=n ; i++) cout << Fibonacci(i) << "\t"; cout << endl; return 0; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 46 / 47

Efektywność iteracyjnego wykonania funkcji Fibonacciego Liczba przypisań Liczba wywołań n algorytm iteracyjny algorytm rekurencyjny 6 15 25 10 27 177 15 42 1 973 20 57 21 891 25 72 242 785 30 87 2 692 537 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 47 / 47

Przykład rekurencji bez końca Algorytm: StadDoWiecznosci (n) 1: if n=1 then 2: return 1; 3: else 4: if (n mod 2)=0 then 5: return StadDoWiecznosci(n-2)*n; 6: else 7: return StadDoWiecznosci(n-1)*n; 8: end if 9: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 48 / 47