Rekurencja i iteracja podobieństwa i różnice dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ Iteracja - definicja Iteracja (łac. iteratio – powtarzanie) – czynność powtarzania (najczęściej wielokrotnego) tej samej instrukcji (albo wielu instrukcji) w pętli. źródło: www.wikipedia.pl funkcja f(n): i = 1 dopóki i <= n wykonaj instrukcja(i) i = i + 1 dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ 2 Rekurencja - definicja Rekurencja, zwana także rekursją (ang. recursion, z łac. recurrere, przybiec z powrotem) – odwoływanie się np. funkcji lub definicji do samej siebie. źródło: www.wikipedia.pl funkcja f(n): jeżeli n = 1 wykonaj instrukcja(f(1)) jeżeli n > 1 wykonaj instrukcja(f(n-1)) dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ 3 Iteracja - przykład Obliczyć sumę wszystkich liczb naturalnych od 1 do 100 funkcja suma(100): s = 0 i = 1 dopóki i <= 100 s = s + i i = i + 1 dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ 4 Rekurencja - definicja Obliczyć sumę wszystkich liczb naturalnych od 1 do 100 funkcja suma(100): jeżeli n = zwróć jeżeli n > zwróć 1 1 1 n + suma(n-1) dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ 5 Iteracja – jak to działa Obliczyć sumę wszystkich liczb naturalnych od 1 do 6 suma(6) s=0 -> s=1 -> s=3 -> s=6 -> s=10 -> s=15 -> s=21 i=1 -> i=2 -> i=3 -> i=4 -> i=5 -> i=6 -> i=7 STOP dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ 6 Rekurencja – jak to działa Obliczyć sumę wszystkich liczb naturalnych od 1 do 6 suma(6) 6 + suma(5) 5 + suma(4) 4 + suma(3) 3 + suma(2) 2 + 2 3 suma(1) + 1 6 10 15 21 STOP dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ 7 Ciąg Fibonacciego - przykład F(1) = 1, F(1) = 1, F(n+2)=F(n+1)+F(n) dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ 8 NWD - przykład NWD(a,b) dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ 9 Iteracja a rekurencja Iteracja jest na ogół bardziej efektywna obliczeniowo niż rekurencja. Rekurencja jest często łatwiejsza w zapisaniu niż iteracja. dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ 10 Programowanie funkcyjne Programowanie funkcyjne, to specjalny typ programowania deklaratywnego w którym programy wykonywane są poprzez obliczanie wyrażeń (funkcji) w odróżnieniu od programowania imperatywnego w którym programy rozumiane są jako kolejno wykonywane po sobie instrukcje zmieniające globalny stan programu. dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ 11 Programowanie imperatywne a deklaratywne dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 12 Haskell Haskell jest jednym z wielu funkcyjnych języków programowania, do których należą m.in. Lisp, Erlang i inne. Haskell jest językiem czysto funkcyjnym, dzięki czemu nie pozwala na skutki uboczne. Głównym założeniem języków czysto funkcyjnych jest to, że wynik działania funkcji jest uzależniony od przekazanych jej parametrów i tylko od nich. Haskell jest często nazywany językiem leniwym (ang. lazy or non-strict), gdyż wyrażenia, które nie są potrzebne, by ustalić odpowiednio dany problem nie są wyznaczane. Haskell jest językiem stosującym silne typowanie. Niemożliwa jest więc przypadkowa konwersja np. Double do Int czy nawet na odwrót tzn. Int do Double. dr Robert Kowalczyk Katedra Analizy Nieliniowej, WMiI UŁ 13 Kompilator i interpreter Haskella Aby pisać programy w Haskellu potrzebny jest kompilator, tj. program który bierze od napisany w Haskellu i zamienia go na bardziej prymitywny kod maszynowy rozumiany przez komputer. W Haskellu mamy dostępny również interpreter, który przetwarza skrypty napisane w Haskellu linia po linii. dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 14 Platforma Haskella dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 15 Pierwszy program/skrypt w Haskellu Pierwszy program : tworzymy skrypt haskel.hs z kodem: main = do putStrLn "Hello World" następnie kompilujemy go i uruchamiamy: ghc haskel.hs lub używając interaktywnej konsoli ghci piszemy putStrLn "Hello World" lub też ładujemy wcześniej napisany skrypt poleceniem :l haskel.hs albo podójnie kilikamy na plik (windows). dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 16 Haskell jako kalkulator dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 17 Funkcje wbudowane abs x => |x| floor x => [x] div => / mod => % max a b => maximum(a,b) min a b => minimum(a,b) sqrt x => x^(1/2) exp x => exp(x) log x => ln(x) sin x => sin(x) cos x => cos(x) tan x => tan(x) pi => 3.141592653589793 dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 18 Notacja pre i in fiksowa dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 19 Typy proste w Haskellu Int – liczby całkowite-229…229-1 Integer – liczby całkowite dowolnej wielkości Float – liczby zmiennoprzecinkowe pojedynczej precyzji Double – liczby zmiennoprzecinkowe podwójnej precyzji Char - (Unicode) typ znakowy Bool – typ logiczny dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 20 Operatory logiczne Prelude>True && (1<4) True Prelude>False || False False Prelude>2 /= 3 True Prelude>not True False dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 21 Listy Prelude> let imiona= ["Jane", "George", "Kate"] Prelude> let liczby= [-2,-1,0,1,2] Prelude> -3 : liczby [-3,-2,-1,0,1,2] Prelude> liczby [-2,-1,0,1,2] Prelude> head liczby -2 Prelude> tail liczby [-1,0,1,2] dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 22 Sekwencje i listy list Prelude>['H','a','s','k','e','l','l'] "Haskell" Prelude>'H':'a':'s':'k':'e':'l':'l':[] "Haskell" Prelude>[1,2..10] [1,2,3,4,5,6,7,8,9,10] Prelude>[5,3..(-1)] [5,3,1,-1] Prelude>[1,2..] 1,2,3,4,…. Prelude>['a'..'z'] "abcdefghijklmnopqrstuvwxyz" Prelude> [[1,2,3],[2,3,4],[3,4,5]] [[1,2,3],[2,3,4],[3,4,5]] dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 23 Wyrażenia kwantyfikatorowe (iteracja) [exp(x) | x <- list, cond(x)] Prelude> [x^2 | x <- [1..10], even x] [4,16,36,64,100] Prelude> [a+b| a<-[1..5], b<-[-5..(-1)]] [-4,-3,-2,-1,0,-3,-2,-1,0,1,-2,-1,0,1,2,-1,0,1,2,3,0,1,2,3,4] Prelude> [head x | x <- [[1..10],[20..30],[30..40]] [1,20,30] dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 24 Leniwe wartościowanie dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 25 Funkcja silnia (rekurencja) dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 26 Suma elementów listy (rekurencja) dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 27 Sortowanie Quick Sort (rekurencja) dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 28 Zadania wspólne Zad 1 Zdefiniuj funkcję mnozenie, która rekurencyjnie mnoży przez siebie dwie dowolne liczby całkowite m i n. Zad 2 Zdefiniuj funkcję dlugosc, która dla zadanej listy wyznaczy jej długość. Zad 3 Zdefiniuj funkcję ileRazyNaLiscie, która zliczy ile razy dany element wystąpił na liście. Zad 4 Wygeneruj listę wszystkich liczb dwucyfrowych podzielnych przez 7. dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 29 Zadania do rozwiązania Zad 1 Zdefiniuj funkcję potegowanie, która rekurencyjnie policzy a^n gdzie a liczba całkowita, a n liczba naturalna lub zero. Zad 2 Zdefiniuj funkcję ostatni, która wyznaczy ostatni element dla zadanej listy. Zad 3 Zdefiniuj funkcję sumaDodatnich, która wyznaczy sumę dodatnich liczb na liście. Zad 4 Wygeneruj listę wszystkich liczb całkowitych z przedziału [100,100], podzielnych przez 7 i parzystych. dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 30 Dziękuję za uwagę dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 31