Podstawy Informatyki

Podobne dokumenty
Wstęp do Informatyki

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

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

Rekurencja. Przygotowała: Agnieszka Reiter

FRAKTALE I SAMOPODOBIEŃSTWO

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

Wstęp do Informatyki

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

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

Fraktale. i Rachunek Prawdopodobieństwa

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

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

Modele i symulacje - Scratch i Excel

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

Algorytmy i Struktury Danych.

5. Rekurencja. Przykłady

O rekurencji i nie tylko

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

ALGORYTMY I STRUKTURY DANYCH

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

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

Algorytmy. wer Wojciech Myszka 30 listopada 2008

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

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

Krzywa uniwersalna Sierpińskiego

Programowanie - wykład 4

Rekurencja (rekursja)

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

Metody algortmiczne (Algorytmy Część IV)

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

Programowanie Proceduralne

samopodobnym nieskończenie subtelny

Jezyki i metody programowania

Wstęp do programowania

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

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

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

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

Technologie Informatyczne Wykład VII

Zbiór Cantora. Diabelskie schody.

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

Matematyka dyskretna. Andrzej Łachwa, UJ, /10

Fraktale w matematyce

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

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

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

Programowanie komputerowe. Zajęcia 3

Technologie informacyjne Wykład VII-IX

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

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

3. Instrukcje warunkowe

Liczby całkowite i rzeczywiste

Wstęp do Informatyki

Rekurencja. Matematyka dyskretna

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

Algorytm. a programowanie -

Wstęp do programowania

Algorytmy i Struktury Danych

Wstęp do programowania

Metody numeryczne w przykładach

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

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

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

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

Wstęp do Informatyki

Wstęp do informatyki

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

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

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

Wymagania edukacyjne niezbędne do otrzymania poszczególnych śródrocznych i rocznych ocen klasyfikacyjnych z matematyki dla klasy VIII

Obliczenia inspirowane Naturą

KRZYŻÓWKA Może być np. równoboczny lub rozwartokątny. Jego pole to a b HASŁO:

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

Geometria. Rodzaje i własności figur geometrycznych:

Wprowadzenie do algorytmiki

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

PLANIMETRIA CZYLI GEOMETRIA PŁASZCZYZNY CZ. 1

Wstęp do programowania

Zadania do samodzielnego rozwiązania

Zaawansowane algorytmy i struktury danych

Wykład IV Algorytmy metody prezentacji i zapisu Rzut oka na język PASCAL

WHILE (wyrażenie) instrukcja;

Programowanie w Baltie klasa VII

Matematyka z kluczem. Układ treści w klasach 4 8 szkoły podstawowej. KLASA 4 (126 h) część 1 (59 h) część 2 (67 h)

WYMAGANIA EDUKACYJNE Z MATEMATYKI KLASA I GIMNAZJUM Małgorzata Janik

V Konkurs Matematyczny Politechniki Białostockiej

1. Rekurencje. Grzegorz Kosiorowski. Uniwersytet Ekonomiczny w Krakowie. zima 2016/2017

6. Pętle while. Przykłady

Algorytmy i Struktury Danych.

PRÓBNY EGZAMIN MATURALNY

2.8. Algorytmy, schematy, programy

Jednoznaczność rozkładu na czynniki pierwsze I

WYMAGANIA EDUKACYJNE NA POSZCZEGÓLNE OCENY MATEMATYKA KLASA 8 DZIAŁ 1. LICZBY I DZIAŁANIA

Weronika Łabaj. Geometria Bolyaia-Łobaczewskiego

WYMAGANIA EDUKACYJNE Z MATEMATYKI W KLASIE VIII

Piotr Chrząstowski-Wachtel Uniwersytet Warszawski. Al Chwarizmi i trzy algorytmy Euklidesa

Programowanie Procedurale

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

Transkrypt:

Podstawy Informatyki Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 14 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 1 / 1

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) Podstawy Informatyki Wykład 14 2 / 1

Rekurencja Rekurencja polega na rozwiazywaniu problemu w oparciu o rozwiazania tego samego problemu dla danych o mniejszych rozmiarach. W informatyce przez rekurencje rozumiemy sposób rozwiazania problemu z zastosowaniem algorytmu rekurencyjnego, czyli algorytmu który w czasie wykonywania odwołuje się do siebie samego. 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. Zwartości opisu rekurencyjnego nie zawsze odpowiada jednak efektywność komputerowych realizacji algorytmów. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 3 / 1

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) Podstawy Informatyki Wykład 14 4 / 1

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) Podstawy Informatyki Wykład 14 5 / 1

Fraktale - przypadkowe odkrycie Nieświadome odkrycie fraktali wiaże się z badaniem długości brzegu wyspy Wielkiej Brytanii. Długość była tym większa, im bardziej dokładna mapę rozważano. Nie zauważono, aby wzrost miał być ograniczony przez jakaś liczbę. Okazało się, że brzeg wyspy jest nieskończenie bogaty w szczegóły, co sugerowałoby jego nieskończona długość. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 6 / 1

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) Podstawy Informatyki Wykład 14 7 / 1

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) Podstawy Informatyki Wykład 14 8 / 1

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) Podstawy Informatyki Wykład 14 9 / 1

Fraktale - Krzywa Kocha 1 2 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 10 / 1

Fraktale - Krzywa Kocha 3 4 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 11 / 1

Fraktale - Krzywa Kocha 0) 1) 2) 3) 4) Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 12 / 1

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) Podstawy Informatyki Wykład 14 13 / 1

Fraktale - Trójkat Sierpińskiego Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 14 / 1

Fraktale - Trójkat Sierpińskiego Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 15 / 1

Fraktale - Dywan Sierpińskiego Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 16 / 1

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) Podstawy Informatyki Wykład 14 17 / 1

Kostka Mengera, gabka Mengera Kostka Mengera, gabka Mengera to bryła fraktalna, trójwymiarowy odpowiednik zbioru Cantora i dywanu Sierpińskiego. Konstrukcja kostki została podana przez austriackiego matematyka Karla Mengera w roku 1927: Dany jest sześcian. Tniemy go na 27 sześcianów równej wielkości płaszczyznami równoległymi do ścian. Usuwamy wszystkie sześciany przyległe do środków ścian pierwotnego sześcianu oraz sześcian znajdujacy się w jego środku. powtarzamy powyższe kroki dla każdego z pozostałych sześcianów, kontynuujac iteracje w niekończoność. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 18 / 1

Kostka Mengera, gabka Mengera Źródło: http://en.wikipedia.org/wiki/menger_sponge Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 19 / 1

Piramida Sierpińskiego Piramida Sierpińskiego, Gabka Sierpińskiego, tetrix - zbiór fraktalny, trójwymiarowy odpowiednik trójkata Sierpińskiego Piramida Sierpińskiego powstaje z czworościanu foremnego przez wykonanie następujacego algorytmu: Weź ostrosłup o boku długości x. Utwórz 4 ostrosłupy o boku długości 1/2x i umieść je w przestrzeni tak, by zawierały się w dużym ostrosłupie oraz każdy miał wspólny jeden wierzchołek z dużym ostrosłupem. Usuń duży ostrosłup. Do każdego z 4 małych ostrosłupów zastosuj ten algorytm. Po nieskończonej liczbie powtórzeń opisanych operacji otrzymujemy piramidę Sierpińskiego. Źródło: http://pl.wikipedia.org/wiki/piramida_sierpinskiego Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 20 / 1

Piramida Sierpińskiego Źródło: http: //www.matematyka.wroc.pl/book/piramida-sierpinskiego Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 21 / 1

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) Podstawy Informatyki Wykład 14 22 / 1

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) Podstawy Informatyki Wykład 14 23 / 1

Rekurencja - powrót do formalizmu Aby algorytm rekurencyjny mógł się zatrzymać, jego kolejne odwołania do siebie samego musza zależeć od pewnego warunku, który zmienia się z każdym kolejnym odwołaniem. Niepożadana cecha definicji rekurencyjnych: aby wyznaczyć n-ta wartość trzeba najpierw wyznaczyć wszystkie wcześniejsze wartości. Dzięki algorytmom rekurencyjnym, rozwiazania wielu trudnych problemów sa bardzo proste. Podstawowe błedy: złe okreslenie warunku zakonczenia programu, niewłasciwa (nieefektywna) dekompozycja problemu. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 24 / 1

Rekurencja - definicja Definicja rekurencyjna składa się z dwóch części. W pierwszej, zwanej podstawowa lub warunkiem poczatkowym sa wyliczone elementy podstawowe, stanowiace części składowe wszystkich pozostałych elementów zbioru. W drugiej części, zwanej krokiem indukcyjnym, sa podane reguły umożliwiajace konstruowanie nowych obiektów z elementów podstawowych lub obiektów zbudowanych wcześniej. Reguły te można stosować wielokrotnie, tworzac nowe obiekty. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 25 / 1

Funkcja silnia n! = 1 2... n - wersja iteracyjna begin write("podaj liczbe n = "); read (n); i:= 1; silnia := 1; while (i <= n) do begin silnia := silnia * i; i := i+1; end; write(silnia); end. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 26 / 1

Funkcja silnia n! = 1 2... n - wersja iteracyjna silnia (n) /** procedura **/ begin if (n=0) then return 1; i := 1; s := 1; while (i <= n) do begin s := s * i; end; return s; end; i := i+1; begin /** program glowny **/ write("podaj liczbe n = "); read (n); m:=silnia (n); write(n); write ("! = "); write (m); end. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 27 / 1

Funkcja silnia n! = 1 2... n - kod C++ #include <iostream> using namespace std; long long silnia(int n){ if (n==0) then return 1; int i = 1; long long s = 1; while (i <= n){ s = s * i; 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) Podstawy Informatyki Wykład 14 28 / 1

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) Podstawy Informatyki Wykład 14 29 / 1

Funkcja silnia - wersja rekurencyjna /** procedura **/ silnia (n) begin if (n=0) then return 1; else return n*silnia(n-1); end. /** program glowny **/ begin write("podaj liczbe n = "); read (n); m:=silnia (n); write(n); write ("! = "); write (m); end. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 30 / 1

Funkcja silnia - 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) Podstawy Informatyki Wykład 14 31 / 1

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) Podstawy Informatyki Wykład 14 32 / 1

Funkcja pow - wersja rekurencyjna pow (a,n) /** procedura **/ begin if (n=0) then return 1; else return a*pow(a,n-1); end. begin /** program glowny **/ write("podaj liczby a i n = "); read (a); read (n); m := pow(a,n); write(a); write ("^"); writw(n); write("="); write (m); end. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 33 / 1

Funkcja pow - 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) Podstawy Informatyki Wykład 14 34 / 1

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) Podstawy Informatyki Wykład 14 35 / 1

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) Podstawy Informatyki Wykład 14 36 / 1

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) Podstawy Informatyki Wykład 14 37 / 1

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) Podstawy Informatyki Wykład 14 38 / 1

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) Podstawy Informatyki Wykład 14 39 / 1

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) Podstawy Informatyki Wykład 14 40 / 1

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) Podstawy Informatyki Wykład 14 41 / 1

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) Podstawy Informatyki Wykład 14 42 / 1

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) Podstawy Informatyki Wykład 14 43 / 1

Ciag Fibonacciego - definicja rekurencyjna 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 F 2 F 1 F 0 F 4 F 2 F 3 F 1 F 5 F 2 F 1 F 0 F 3 F 1 F 1 F 0 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 44 / 1

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) Podstawy Informatyki Wykład 14 45 / 1

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) Podstawy Informatyki Wykład 14 46 / 1

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) Podstawy Informatyki Wykład 14 47 / 1

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) Podstawy Informatyki Wykład 14 48 / 1

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) Podstawy Informatyki Wykład 14 49 / 1

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) Podstawy Informatyki Wykład 14 50 / 1

Efektywność iteracyjnego wykonania funkcji Fibonacciego n 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) Podstawy Informatyki Wykład 14 51 / 1

Wieże Hanoi Zagadka: Dane sa trzy pale: A, B i C. Na jeden z nich, np. na A nałożono krażki o różnych średnicach, tak że krażek mniejszy nie leży pod wiekszym. Pale B i C sa puste. Należy przenieść wszystkie krażki z pala A na C. Można używac B jako pomocnicze miejsce przechowywania. Nie można kłaść krażków wiekszych na mniejsze. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 52 / 1

Wieże Hanoi 1 Krażek 1 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 53 / 1

Wieże Hanoi 1 Krażek 1 Dysk przeniesiony z palika 1 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 54 / 1

Wieże Hanoi 1 Krażek OK 1 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 55 / 1

Wieże Hanoi 2 Krażki 1 2 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 56 / 1

Wieże Hanoi 2 Krażki 2 1 Dysk przeniesiony z palika 1 na palik 2. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 57 / 1

Wieże Hanoi 2 Krażki 1 2 Dysk przeniesiony z palika 1 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 58 / 1

Wieże Hanoi 2 Krażki 1 2 Dysk przeniesiony z palika 2 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 59 / 1

Wieże Hanoi 2 Krażki OK 1 2 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 60 / 1

Wieże Hanoi 3 Krażki 1 2 3 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 61 / 1

Wieże Hanoi 3 Krażki 2 3 1 Dysk przeniesiony z palika 1 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 62 / 1

Wieże Hanoi 3 Krażki 3 2 1 Dysk przeniesiony z palika 1 na palik 2. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 63 / 1

Wieże Hanoi 3 Krażki 1 3 2 Dysk przeniesiony z palika 3 na palik 2. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 64 / 1

Wieże Hanoi 3 Krażki 1 2 3 Dysk przeniesiony z palika 1 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 65 / 1

Wieże Hanoi 3 Krażki 1 2 3 Dysk przeniesiony z palika 2 na palik 1. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 66 / 1

Wieże Hanoi 3 Krażki 2 1 3 Dysk przeniesiony z palika 2 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 67 / 1

Wieże Hanoi 3 Krażki 1 2 3 Dysk przeniesiony z palika 1 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 68 / 1

Wieże Hanoi 3 Krażki OK 1 2 3 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 69 / 1

Wieże Hanoi 4 Krażki 1 2 3 4 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 70 / 1

Wieże Hanoi 4 Krażki 2 3 4 1 Dysk przeniesiony z palika 1 na palik 2. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 71 / 1

Wieże Hanoi 4 Krażki 3 4 1 2 Dysk przeniesiony z palika 1 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 72 / 1

Wieże Hanoi 4 Krażki 3 4 1 2 Dysk przeniesiony z palika 2 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 73 / 1

Wieże Hanoi 4 Krażki 1 4 3 2 Dysk przeniesiony z palika 1 na palik 2. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 74 / 1

Wieże Hanoi 4 Krażki 1 4 3 2 Dysk przeniesiony z palika 3 na palik 1. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 75 / 1

Wieże Hanoi 4 Krażki 1 4 2 3 Dysk przeniesiony z palika 3 na palik 2. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 76 / 1

Wieże Hanoi 4 Krażki 1 2 4 3 Dysk przeniesiony z palika 1 na palik 2. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 77 / 1

Wieże Hanoi 4 Krażki 1 2 3 4 Dysk przeniesiony z palika 1 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 78 / 1

Wieże Hanoi 4 Krażki 2 3 1 4 Dysk przeniesiony z palika 2 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 79 / 1

Wieże Hanoi 4 Krażki 1 2 3 4 Dysk przeniesiony z palika 2 na palik 1. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 80 / 1

Wieże Hanoi 4 Krażki 1 2 3 4 Dysk przeniesiony z palika 3 na palik 1. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 81 / 1

Wieże Hanoi 4 Krażki 1 2 3 4 Dysk przeniesiony z palika 2 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 82 / 1

Wieże Hanoi 4 Krażki 3 2 1 4 Dysk przeniesiony z palika 1 na palik 2. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 83 / 1

Wieże Hanoi 4 Krażki 2 3 1 4 Dysk przeniesiony z palika 1 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 84 / 1

Wieże Hanoi 4 Krażki 1 2 3 4 Dysk przeniesiony z palika 2 na palik 3. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 85 / 1

Wieże Hanoi 4 Krażki OK 1 2 3 4 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 86 / 1

Wieże Hanoi 5 Krażków? 1 2 3 4 5 Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 87 / 1

Wieże Hanoi Zagadka Wież Hanoi stała się znana w XIX wieku dzięki matematykowi Edouardowi Lucas, który zaproponował tę zagadkę dla 8 krażków. Do sprzedawanego zestawu była dołaczona - wymyślona przez Lucas - Tybetańska legenda, według której mnisi w światyni Brahmy rozwiazuj a tę łamigłówkę dla 64 złotych krażków. Legenda mówi, że gdy mnisi zakończa zadanie, to nastapi koniec świata. Zakładajac, że mnisi wykonuja 1 ruch na sekundę, ułożenie wieży zajmie 2 64 1 = 18446744073709551615 (blisko 18 i pół tryliona) sekund, czyli około 584542 miliardów lat. Dla porównania: Wszechświat ma około 13,7 mld lat. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 88 / 1

Wieże Hanoi - algorytm rekurencyjny Oznaczmy pale przez A, B, C Niech n oznacza liczbę krażków ponumerujmy krażki od najmniejszego u góry do największego u dołu W celu przeniesienia n krażków z A do C należy: przenieść n 1 krażków z A do B - wówczas n-ty dysk samotnie pozostaje w A przenieść n-ty (największy) krażek z A do C przenieść n 1 krażków z B do C Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 89 / 1

Przykład rekurencji bez końca StadDoWiecznosci(n) begin if (n=1) then return 1; else begin if ((n mod 2)=0) then // czy n jest parzyste? return StadDoWiecznosci(n-2)*n; else return StadDoWiecznosci(n-1)*n; endif; endif; end. Bożena Woźna-Szcześniak (AJD) Podstawy Informatyki Wykład 14 90 / 1