Algorytmy i Struktury Danych. - Rekurencjawozna.org/students/2014-2015/asd/asd02.pdf ·...

69
Algorytmy i Struktury Danych. Rekurencja dr hab. Bo˙ zena Wo´ zna-Szcze´ sniak [email protected] Jan Dlugosz University, Poland Wyklad 2 Bo˙ zena Wo´ zna-Szcze´ sniak (AJD) Algorytmy i Struktury Danych. Wyklad 2 1 / 47

Transcript of Algorytmy i Struktury Danych. - Rekurencjawozna.org/students/2014-2015/asd/asd02.pdf ·...

Algorytmy i Struktury Danych.Rekurencja

dr hab. Bozena [email protected]

Jan Długosz University, Poland

Wykład 2

Bozena Wozna-Szczesniak (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 sie np. definicji lub funkcji czyprocedury do samej siebie.

Rekurencyjny - mat. dajacy sie wyrazic za pomoca wielkosciuprzednio znanych; wzór rekurencyjny - wzór pozwalajacyobliczyc wyrazy ciagu na podstawie jednego lub kilku wyrazówpoprzedzajacych. <ang. recurrent, fr. recurrent, z łac. recurrens’powracajacy’>.

[Słownik Wyrazów Obcych, PWN, 1996]

Bozena Wozna-Szczesniak (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 sie np. definicji lub funkcji czyprocedury do samej siebie.Rekurencyjny - mat. dajacy sie wyrazic za pomoca wielkosciuprzednio znanych; wzór rekurencyjny - wzór pozwalajacyobliczyc wyrazy ciagu na podstawie jednego lub kilku wyrazówpoprzedzajacych. <ang. recurrent, fr. recurrent, z łac. recurrens’powracajacy’>.

[Słownik Wyrazów Obcych, PWN, 1996]

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 2 / 47

Rekurencja

Rekurencja polega na rozwiazywaniu problemu w oparciu orozwiazania tego samego problemu dla danych o mniejszychrozmiarach.

W informatyce rekurencja jest technika programistyczna,polegajaca na wywoływaniu funkcji wewnatrz niej samej.Rekurencja jest jedna z najbardziej interesujacych technikprogramistycznych i to w dodatku technika zaskakujacoefektywna.Rekurencyjny opis obliczen jest na ogół bardziej zwarty niz opistych samych obliczen bez uzycia rekurencji. Taki opis jeststosowany np. przy opisie fraktali.Niektóre rozwiazania rekurencyjne moga byc nieefektywne. Wtakich przypadkach mozna je zastapic rozwiazaniamiwykorzystujacymi zwyczajna petle lub stos.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Rekurencja

Rekurencja polega na rozwiazywaniu problemu w oparciu orozwiazania tego samego problemu dla danych o mniejszychrozmiarach.W informatyce rekurencja jest technika programistyczna,polegajaca na wywoływaniu funkcji wewnatrz niej samej.

Rekurencja jest jedna z najbardziej interesujacych technikprogramistycznych i to w dodatku technika zaskakujacoefektywna.Rekurencyjny opis obliczen jest na ogół bardziej zwarty niz opistych samych obliczen bez uzycia rekurencji. Taki opis jeststosowany np. przy opisie fraktali.Niektóre rozwiazania rekurencyjne moga byc nieefektywne. Wtakich przypadkach mozna je zastapic rozwiazaniamiwykorzystujacymi zwyczajna petle lub stos.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Rekurencja

Rekurencja polega na rozwiazywaniu problemu w oparciu orozwiazania tego samego problemu dla danych o mniejszychrozmiarach.W informatyce rekurencja jest technika programistyczna,polegajaca na wywoływaniu funkcji wewnatrz niej samej.Rekurencja jest jedna z najbardziej interesujacych technikprogramistycznych i to w dodatku technika zaskakujacoefektywna.

Rekurencyjny opis obliczen jest na ogół bardziej zwarty niz opistych samych obliczen bez uzycia rekurencji. Taki opis jeststosowany np. przy opisie fraktali.Niektóre rozwiazania rekurencyjne moga byc nieefektywne. Wtakich przypadkach mozna je zastapic rozwiazaniamiwykorzystujacymi zwyczajna petle lub stos.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Rekurencja

Rekurencja polega na rozwiazywaniu problemu w oparciu orozwiazania tego samego problemu dla danych o mniejszychrozmiarach.W informatyce rekurencja jest technika programistyczna,polegajaca na wywoływaniu funkcji wewnatrz niej samej.Rekurencja jest jedna z najbardziej interesujacych technikprogramistycznych i to w dodatku technika zaskakujacoefektywna.Rekurencyjny opis obliczen jest na ogół bardziej zwarty niz opistych samych obliczen bez uzycia rekurencji. Taki opis jeststosowany np. przy opisie fraktali.

Niektóre rozwiazania rekurencyjne moga byc nieefektywne. Wtakich przypadkach mozna je zastapic rozwiazaniamiwykorzystujacymi zwyczajna petle lub stos.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Rekurencja

Rekurencja polega na rozwiazywaniu problemu w oparciu orozwiazania tego samego problemu dla danych o mniejszychrozmiarach.W informatyce rekurencja jest technika programistyczna,polegajaca na wywoływaniu funkcji wewnatrz niej samej.Rekurencja jest jedna z najbardziej interesujacych technikprogramistycznych i to w dodatku technika zaskakujacoefektywna.Rekurencyjny opis obliczen jest na ogół bardziej zwarty niz opistych samych obliczen bez uzycia rekurencji. Taki opis jeststosowany np. przy opisie fraktali.Niektóre rozwiazania rekurencyjne moga byc nieefektywne. Wtakich przypadkach mozna je zastapic rozwiazaniamiwykorzystujacymi zwyczajna petle lub stos.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Czym jest fraktal?

“Fraktalem jest wszystko...”Benoit Mandelbrot

Fraktal jest figura geometryczna o złozonej strukturze, nie bedacakrzywa, powierzchnia ani bryła w rozumieniu klasycznejmatematyki; charakteryzuje ja ułamkowy wymiar (stad nazwafraktal -ang. ’fraction’ ułamek, łac. ’fractus’ złamany).Fraktale sa bardzo skomplikowane, totez dopiero komputeryumozliwiły ich głebsze poznanie.Wielu badaczy twierdzi, ze geometria fraktali jest geometriaprzyrody.Fraktale dały poczatek nowej geometrii zwanej geometriafraktalna, która pozwala modelowac wiele obiektów i zjawiskwystepujacych w przyrodzie i nie tylko ...

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 4 / 47

Czym jest fraktal?

“Fraktalem jest wszystko...”Benoit Mandelbrot

Fraktal jest figura geometryczna o złozonej strukturze, nie bedacakrzywa, powierzchnia ani bryła w rozumieniu klasycznejmatematyki; charakteryzuje ja ułamkowy wymiar (stad nazwafraktal -ang. ’fraction’ ułamek, łac. ’fractus’ złamany).

Fraktale sa bardzo skomplikowane, totez dopiero komputeryumozliwiły ich głebsze poznanie.Wielu badaczy twierdzi, ze geometria fraktali jest geometriaprzyrody.Fraktale dały poczatek nowej geometrii zwanej geometriafraktalna, która pozwala modelowac wiele obiektów i zjawiskwystepujacych w przyrodzie i nie tylko ...

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 4 / 47

Czym jest fraktal?

“Fraktalem jest wszystko...”Benoit Mandelbrot

Fraktal jest figura geometryczna o złozonej strukturze, nie bedacakrzywa, powierzchnia ani bryła w rozumieniu klasycznejmatematyki; charakteryzuje ja ułamkowy wymiar (stad nazwafraktal -ang. ’fraction’ ułamek, łac. ’fractus’ złamany).Fraktale sa bardzo skomplikowane, totez dopiero komputeryumozliwiły ich głebsze poznanie.

Wielu badaczy twierdzi, ze geometria fraktali jest geometriaprzyrody.Fraktale dały poczatek nowej geometrii zwanej geometriafraktalna, która pozwala modelowac wiele obiektów i zjawiskwystepujacych w przyrodzie i nie tylko ...

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 4 / 47

Czym jest fraktal?

“Fraktalem jest wszystko...”Benoit Mandelbrot

Fraktal jest figura geometryczna o złozonej strukturze, nie bedacakrzywa, powierzchnia ani bryła w rozumieniu klasycznejmatematyki; charakteryzuje ja ułamkowy wymiar (stad nazwafraktal -ang. ’fraction’ ułamek, łac. ’fractus’ złamany).Fraktale sa bardzo skomplikowane, totez dopiero komputeryumozliwiły ich głebsze poznanie.Wielu badaczy twierdzi, ze geometria fraktali jest geometriaprzyrody.

Fraktale dały poczatek nowej geometrii zwanej geometriafraktalna, która pozwala modelowac wiele obiektów i zjawiskwystepujacych w przyrodzie i nie tylko ...

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 4 / 47

Czym jest fraktal?

“Fraktalem jest wszystko...”Benoit Mandelbrot

Fraktal jest figura geometryczna o złozonej strukturze, nie bedacakrzywa, powierzchnia ani bryła w rozumieniu klasycznejmatematyki; charakteryzuje ja ułamkowy wymiar (stad nazwafraktal -ang. ’fraction’ ułamek, łac. ’fractus’ złamany).Fraktale sa bardzo skomplikowane, totez dopiero komputeryumozliwiły ich głebsze poznanie.Wielu badaczy twierdzi, ze geometria fraktali jest geometriaprzyrody.Fraktale dały poczatek nowej geometrii zwanej geometriafraktalna, która pozwala modelowac wiele obiektów i zjawiskwystepujacych w przyrodzie i nie tylko ...

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 4 / 47

Fraktale

Najstarsze fraktale wymyslilimatematycy na poczatku XX-wieku,w wyniku zmagan z definicja wymiarui krzywej.Najwybitniejszym twórca fraktali jestamerykanski matematyk i informatykpolskiego pochodzenia - BenoitMandelbrot. Na miedzynarodowymkongresie matematyków wWarszawie w roku 1983 stwierdził, zejest jeszcze za wczesnie naformułowanie scisłej definicji fraktalaponiewaz nie znamy dostateczniegłeboko istoty tego pojecia.

Zródło: http://en.wikipedia.org/wiki/Benoit_Mandelbrot

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 5 / 47

Cechy fraktali

Fraktale maja ceche samopodobienstwa.Nie sa okreslone wzorem matematycznym, tylko zaleznosciarekurencyjna.Sa obiektami których wymiar nie jest liczba całkowita.Kazdy fraktal mozna w nieskonczonosc przyblizac.

Kalafior Brokuł Drzewo

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 6 / 47

Cechy fraktali

Fraktale maja ceche samopodobienstwa.Nie sa okreslone wzorem matematycznym, tylko zaleznosciarekurencyjna.Sa obiektami których wymiar nie jest liczba całkowita.Kazdy fraktal mozna w nieskonczonosc przyblizac.

Kalafior Brokuł Drzewo

Bozena Wozna-Szczesniak (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. Ichtwórcami byli matematycy: Georg Cantor, David Hilbert, Helgevon Koch oraz Wacław Sierpinski.

W roku 1883 Georg Cantor zaproponował prosta konstrukcje, wwyniku której otrzymuje sie zbiór nazwany jego imieniem.Konstrukacja: Odcinek [0,1] dzielimy na trzy równe czesci iusuwamy srodkowa. Z pozostałymi dwoma odcinkamipostepujemy analogicznie. W konsekwencji takiego postepowaniaw granicy nieskonczonej ilosci kroków powstaje zbiór punktówCantora.

Bozena Wozna-Szczesniak (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. Ichtwórcami byli matematycy: Georg Cantor, David Hilbert, Helgevon Koch oraz Wacław Sierpinski.W roku 1883 Georg Cantor zaproponował prosta konstrukcje, wwyniku której otrzymuje sie zbiór nazwany jego imieniem.Konstrukacja: Odcinek [0,1] dzielimy na trzy równe czesci iusuwamy srodkowa. Z pozostałymi dwoma odcinkamipostepujemy analogicznie. W konsekwencji takiego postepowaniaw granicy nieskonczonej ilosci kroków powstaje zbiór punktówCantora.

Bozena Wozna-Szczesniak (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. Ichtwórcami byli matematycy: Georg Cantor, David Hilbert, Helgevon Koch oraz Wacław Sierpinski.W roku 1883 Georg Cantor zaproponował prosta konstrukcje, wwyniku której otrzymuje sie zbiór nazwany jego imieniem.Konstrukacja: Odcinek [0,1] dzielimy na trzy równe czesci iusuwamy srodkowa. Z pozostałymi dwoma odcinkamipostepujemy analogicznie. W konsekwencji takiego postepowaniaw granicy nieskonczonej ilosci kroków powstaje zbiór punktówCantora.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 7 / 47

Fraktale - Krzywa Kocha

W 1904 roku szwedzki matematyk Helge von Koch zaproponowałkonstrukcje nazywana potocznie płatkiem sniegu.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 8 / 47

Fraktale - Krzywa Kocha

1

2

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 9 / 47

Fraktale - Krzywa Kocha

1

2

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 9 / 47

Fraktale - Krzywa Kocha

3

4

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 10 / 47

Fraktale - Krzywa Kocha

3

4

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 10 / 47

Fraktale - Krzywa Kocha

0) 1) 2)

3) 4)

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 11 / 47

Fraktale - Wacław Sierpinski

W 1916 roku Wacław Sierpinski(14.03.1882- 21.10.1969) rozszerzyłzbiór Cantora na dwa wymiary.Kwadrat jednostkowy dzielimy nadziewiec i wyrzucamy srodkowy.Postepujemy tak z kazdym nowopowstałym kwadratem. Powstałyfraktal nazywany dywanemSierpinskiego.Analogicznie mozna postapic ztrójkatem, którego boki dzielimy nadwie czesci i powstałe punktyłaczymy co doprowadzi do powstaniakolejnego trójkata, który usuwamy. Zpozostałymi trzema postepujemypodobnie, itd.

Zródło:http://www.gap-system.org/~history/Biographies/Sierpinski.html

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 12 / 47

Fraktale - Trójkat Sierpinskiego

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 13 / 47

Fraktale - Trójkat Sierpinskiego

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 14 / 47

Fraktale - Dywan Sierpinskiego

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 15 / 47

Fraktale - Krzywa Hilberta

Krzywa Hilberta - to przykład krzywej, która wypełnia całkowiciepłaszczyzne, tzn. przechodzi przez wszystkie punkty płaszczyzny.Konstrukcja tej krzywej została podana przez Davida Hilberta w1891 jako wariant krzywej Peano.

n = 1 n = 2 n = 3 n = 4 n = 5

Bozena Wozna-Szczesniak (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łaszczyznyc - liczba zespolona bedaca parametrem zbioru.Dla róznych c otrzymujemy rózne zbiory.

Bozena Wozna-Szczesniak (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 bedaca parametrem zbioru.Dla róznych c otrzymujemy rózne zbiory.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 18 / 47

Rekurencja - podstawowe informacje

Metoda rekurencyjna cyklicznie wywołuje sama siebie, za kazdymrazem przekazujac w wywołaniu inne argumenty.Przekazanie argumentu o pewnej wartosci powoduje, ze metodakonczy działanie bez kolejnego wywołania samej siebie. Sytuacjata jest nazywana przypadkiem bazowym.Gdy najbardziej ”wewnetrzne” wywołanie metody zostajezakonczone, rozpoczyna sie proces zakanczania kolejnychwywołan, który w koncu doprowadza do zakonczeniapoczatkowego wywołania.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 19 / 47

Funkcja silnia n! = 1 · 2 · . . . · n - wersja iteracyjna

Require: Liczba n1: i := 1;2: silnia := 1;3: while i <= n do4: silnia := silnia * i;5: i:= i+1;6: end while7: return silnia;

Bozena Wozna-Szczesniak (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;

}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 21 / 47

Rekurencja - funkcja silnia

silnia(n) =

{1 dla n = 0n ∗ 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óc 1.5 zwróc 1 ∗ 16 zwróc 1 ∗ 1 ∗ 27 zwróc 1 ∗ 1 ∗ 2 ∗ 38 Zatem silnia(3) = 6 !

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 22 / 47

Rekurencja - funkcja silnia

silnia(n) =

{1 dla n = 0n ∗ 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óc 1.5 zwróc 1 ∗ 16 zwróc 1 ∗ 1 ∗ 27 zwróc 1 ∗ 1 ∗ 2 ∗ 38 Zatem silnia(3) = 6 !

Bozena Wozna-Szczesniak (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;

}

Bozena Wozna-Szczesniak (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, . . . (gdzietrzykropek oznacza, ciag jest nieskonczony).n-ty element ciagu jest uzyskiwany poprzez dodanie liczby n dopoprzedniego elementu ciagu. A zatem, drugi element ciagu to 2plus wartosc pierwszego elementu (czyli 1), co daje 3. Trzecielement ciagu to 3 plus 3 (wartosc drugiego elementu), co daje 6;i tak dalej.Liczby trójkatne mozna przedstawic za pomoca odpowiedniejilosci obiektów (kulek, pudełek, itp.) rozmieszczonych w formietrójkata.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 24 / 47

Liczby trójkatne

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 25 / 47

Algorytm obliczajacy n-ta liczbe trójkatna

Algorytm: triangle (n)1: if n< 1 then2: return 0;3: else4: if n=1 then5: return 1;6: else7: return n+ triangle(n - 1);8: end if9: end if

Bozena Wozna-Szczesniak (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;

}

Bozena Wozna-Szczesniak (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;elseif (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;

}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 28 / 47

Rekurencja - obliczanie an

an = pow(a,n) =

{1 dla n = 0a ∗ 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óc 1.5 zwróc 1 ∗ 26 zwróc 1 ∗ 2 ∗ 27 zwróc 1 ∗ 2 ∗ 2 ∗ 28 Zatem pow(2,3) = 8 !

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 29 / 47

Rekurencja - obliczanie an

an = pow(a,n) =

{1 dla n = 0a ∗ 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óc 1.5 zwróc 1 ∗ 26 zwróc 1 ∗ 2 ∗ 27 zwróc 1 ∗ 2 ∗ 2 ∗ 28 Zatem pow(2,3) = 8 !

Bozena Wozna-Szczesniak (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;

}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 30 / 47

Rekurencja - algorytm Euklidesa

Dane: a, b - dwie liczby naturalneDane wyjsciowe: liczba naturalna bedacanajwiekszym wspólnym dzielnikiem liczb a ib.Rozwiazanie rekurencyjne:

NWD(a,b) =

{a dla b = 0NWD(b,a mod b) dla b > 0 Euklides z

Aleksandrii ok.365-300 p.n.e.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 31 / 47

Rekurencja - algorytm Euklidesa

NWD(a,b) =

{a dla b = 0NWD(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.

Bozena Wozna-Szczesniak (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;

}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 33 / 47

Ciag Fibonacciego

Liczby naturalne tworzace ciag o takiej własnosci, ze kolejnywyraz (z wyjatkiem dwóch pierwszych) jest suma dwóchpoprzednich nazywa sie liczbami Fibonacciego.

Poczatkowe wartosci tego ciagu to:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, . . .Ciag Fibonacciego zawdziecza swoja nazwe włoskiemumatematykowi z Pizy, Leonardowi, który pod nazwiskiemFibonacci wydał w 1202 roku słynna ksiege Liber Abacizawierajaca opis tego ciagu jako rozwiazanie zadania orozmnazaniu sie królików. Ojciec Leonarda nosił przydomekBonacci, stad syn został Fibonaccim (filius Bonacci - syndobrotliwego).

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 34 / 47

Ciag Fibonacciego

Liczby naturalne tworzace ciag o takiej własnosci, ze kolejnywyraz (z wyjatkiem dwóch pierwszych) jest suma dwóchpoprzednich nazywa sie liczbami Fibonacciego.Poczatkowe wartosci tego ciagu to:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, . . .

Ciag Fibonacciego zawdziecza swoja nazwe włoskiemumatematykowi z Pizy, Leonardowi, który pod nazwiskiemFibonacci wydał w 1202 roku słynna ksiege Liber Abacizawierajaca opis tego ciagu jako rozwiazanie zadania orozmnazaniu sie królików. Ojciec Leonarda nosił przydomekBonacci, stad syn został Fibonaccim (filius Bonacci - syndobrotliwego).

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 34 / 47

Ciag Fibonacciego

Liczby naturalne tworzace ciag o takiej własnosci, ze kolejnywyraz (z wyjatkiem dwóch pierwszych) jest suma dwóchpoprzednich nazywa sie liczbami Fibonacciego.Poczatkowe wartosci tego ciagu to:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, . . .Ciag Fibonacciego zawdziecza swoja nazwe włoskiemumatematykowi z Pizy, Leonardowi, który pod nazwiskiemFibonacci wydał w 1202 roku słynna ksiege Liber Abacizawierajaca opis tego ciagu jako rozwiazanie zadania orozmnazaniu sie królików. Ojciec Leonarda nosił przydomekBonacci, stad syn został Fibonaccim (filius Bonacci - syndobrotliwego).

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 34 / 47

Ciag Fibonacciego - rozmnazanie królików

Zadanie Fibonacciego: Ile par królików moze spłodzic jednapara w ciagu roku, jesli:

kazda para rodzi nowa pare w ciagu miesiaca,para staje sie płodna po miesiacu,króliki nie umieraja.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 35 / 47

Ciag Fibonacciego - Złoty podział

W wyniku podzielenia kazdej z liczb ciagu przez jej poprzednikotrzymuje sie iloraz oscylujacy wokół 1,618 - liczby złotegopodziału. W miare zwiekszania sie liczb zmniejszaja sieodchylenia od tej wartosci. Dokładna wartosc granicy jest złotaliczba:

Φ =

√5 + 12

= 1,6180339887498948482...

... 233/144 = 1.61805555556144/89 = 1.6179775280989/55 = 1.6181818181855/34 = 1.6176470588234/21 = 1.6190476190521/13 = 1.61538461538 ...

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 36 / 47

Ciag Fibonacciego - Złoty podział

W wyniku podzielenia kazdej z liczb ciagu przez jej poprzednikotrzymuje sie iloraz oscylujacy wokół 1,618 - liczby złotegopodziału. W miare zwiekszania sie liczb zmniejszaja sieodchylenia od tej wartosci. Dokładna wartosc granicy jest złotaliczba:

Φ =

√5 + 12

= 1,6180339887498948482...

... 233/144 = 1.61805555556144/89 = 1.6179775280989/55 = 1.6181818181855/34 = 1.6176470588234/21 = 1.6190476190521/13 = 1.61538461538 ...

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 36 / 47

Ciag Fibonacciego - Złoty podział

W wyniku podzielenia kazdej z liczb ciagu przez jej nastepnikotrzymuje sie iloraz oscylujacy wokół 0,618 - liczby złotegopodziału. W miare zwiekszania sie liczb zmniejszaja sieodchylenia od tej wartosci. Dokładna wartosc granicy jest złotaliczba:

Φ =

√5− 12

= 0,618033989...

... 144/233 = 0.61802575107389/144 = 0.61805555555655/89 = 0.6179775280934/55 = 0.61818181818221/34 = 0.61764705882413/21 = 0.619047619048 ...

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 37 / 47

Ciag Fibonacciego - Złoty podział

W wyniku podzielenia kazdej z liczb ciagu przez jej nastepnikotrzymuje sie iloraz oscylujacy wokół 0,618 - liczby złotegopodziału. W miare zwiekszania sie liczb zmniejszaja sieodchylenia od tej wartosci. Dokładna wartosc granicy jest złotaliczba:

Φ =

√5− 12

= 0,618033989...

... 144/233 = 0.61802575107389/144 = 0.61805555555655/89 = 0.6179775280934/55 = 0.61818181818221/34 = 0.61764705882413/21 = 0.619047619048 ...

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 37 / 47

Ciag Fibonacciego - Złoty podział

Złoty podział (łac. sectio aurea), podział harmoniczny, złotaproporcja, boska proporcja (łac. divina proportio) - podziałodcinka na dwie czesci tak, by stosunek długosci dłuzszej z nichdo krótszej był taki sam, jak całego odcinka do czesci dłuzszej.

Φ =a + b

a=

ab

Złotymi proporcjami wyznaczonymi na podstawie ciaguFibonacciego posługiwał sie w swoim malarstwie Leonardo daVinci i Botticelli.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 38 / 47

Ciag Fibonacciego - Złoty podział

Złoty podział (łac. sectio aurea), podział harmoniczny, złotaproporcja, boska proporcja (łac. divina proportio) - podziałodcinka na dwie czesci tak, by stosunek długosci dłuzszej z nichdo krótszej był taki sam, jak całego odcinka do czesci dłuzszej.

Φ =a + b

a=

ab

Złotymi proporcjami wyznaczonymi na podstawie ciaguFibonacciego posługiwał sie w swoim malarstwie Leonardo daVinci i Botticelli.

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 38 / 47

Ciag Fibonacciego - gdzie go mozna znalezc ?

Ciag Fibonacciego mozna odnalezc w wielu aspektach przyrody,ciag taki opisuje np. liczbe pedów rosliny jednostajnieprzyrastajacej w latach.W słoneczniku mozemy zaobserwowac dwa układy liniispiralnych, wychodzacych ze srodka. Liczba linii rozwijajacych siezgodnie z ruchem wskazówek zegara wynosi 55 i tylko 34skreconych w przeciwna strone.Takie same spirale mozna zaobserwowac na wielu innychroslinach (np. kalafior, ananas). Liczby spiral wystepujacych wtych roslinach sa kolejnymi liczbami Fibonacciego.

Zródło: http://www.math.edu.pl/liczby-fibonacciego

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 39 / 47

Ciag Fibonacciego - algorytm rekurencyjny

Ciag Fibonacciego definiujemy rekurencyjnie w sposóbnastepujacy:F0 = 0F1 = 1Fn = Fn−1 + Fn−2, dla n ≥ 2

Require: Liczba n {F0, . . . ,Fn−1,Fn}Algorytm: FIB (n)

1: if n < 2 then2: return n;3: else4: return FIB(n − 2) + FIB(n − 1);5: end if

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 40 / 47

Ciag Fibonacciego - definicja rekurencyjna

Definicja: F0 = 0, F1 = 1, Fn = Fn−1 + Fn−2 dla n ≥ 2

F5

F4

F2

F1 F0

F3

F2

F1 F0

F1

F3

F2

F1 F0

F1

Bozena Wozna-Szczesniak (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;

}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 42 / 47

Ciag Fibonacciego - spirala

f (n) =

0 if n = 01 if n = 1f (n − 1) + f (n − 2) if n ≥ 2

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 43 / 47

Efektywnosc rekurencyjnego wykonania funkcjiFibonacciego

n Liczba dodawan Liczba wywołan6 12 25

10 88 17715 986 1 97320 10 945 21 89125 121 392 242 78530 1 346 268 2 692 537

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 44 / 47

Ciag Fibonacciego - algorytm iteracyjny

Require: Liczba n {F0, . . . ,Fn−1,Fn}Algorytm: FIB (n)

1: if n < 2 then2: return n;3: else4: f0 := 0;5: f1 := 1;6: for i := 2→ n do7: m := f0 + f1;8: f0 := f1;9: f1 := m;

10: end for11: end if12: return m;

Bozena Wozna-Szczesniak (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;

}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 46 / 47

Efektywnosc iteracyjnego wykonania funkcjiFibonacciego

Liczba przypisan Liczba wywołann algorytm iteracyjny algorytm rekurencyjny6 15 25

10 27 17715 42 1 97320 57 21 89125 72 242 78530 87 2 692 537

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 47 / 47

Przykład rekurencji bez konca

Algorytm: StadDoWiecznosci (n)1: if n=1 then2: return 1;3: else4: if (n mod 2)=0 then5: return StadDoWiecznosci(n-2)*n;6: else7: return StadDoWiecznosci(n-1)*n;8: end if9: end if

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 2 48 / 47