Rekurencja i iteracja

advertisement
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
Download