Haskell. Dopasowanie do wzorca Jest to operacja, gdzie pewnie wyrażenie sprawdza się ze wzorcem, w którym może znajdować się jedno lub więcej "wolnych.

Slides:



Advertisements
Podobne prezentacje
Instrukcje - wprowadzenie
Advertisements

C++ wykład 9 ( ) Szablony.
C++ wykład 4 ( ) Przeciążanie operatorów.
Rekurencja 1 Podprogram lub strukturę danych nazywamy rekurencyjną, (recursive subprogram, recursive data structure) jeżeli częściowo składa się z samej.
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Wzorce.
Programowanie I Rekurencja.
MATEMATYKA-ułamki zwykłe
PROGRAMOWANIE STRUKTURALNE
Materiały pochodzą z Platformy Edukacyjnej Portalu
ZŁOŻONOŚĆ OBLICZENIOWA
Turbo pascal – instrukcje warunkowe, iteracyjne,…
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Podstawy informatyki Rekurencja i rekurencja Grupa: 1A
Podstawy informatyki Informatyka stosowana Prowadzący: Grzegorz Smyk
Dodawanie i odejmowanie wektorów
1 Dygresja: cztery płyty główne…. 2 Dygresja: osobliwości C /* cos o nieistniejacym typie Boolean */ /* oraz o operatorze przecinkowym */ #include int.
Tablice jednowymiarowe 1
SO – LAB3 Wojciech Pieprzyca
Schemat Hornera Mgr inż. Michał Szucki.
Matematyka.
Podstawy programowania
Instrukcje sterujące część 1
Zbiór do posortowania mieści się w pamięci
Programowanie strukturalne i obiektowe
Funkcje w Pascalu Przypomnienie wiadomości o procedurach Prowadzący: Anna Kaleta Piotr Chojnacki.
Instrukcje sterujące część 2
Przegląd podstawowych algorytmów
Algorytmy i struktury danych
Algorytmy i struktury danych
Centrum Kształcenia Ustawicznego im. St. Staszica w Koszalinie
ITERACJA - powtórzenie
Łódź, 3 października 2013 r. Katedra Analizy Nieliniowej, WMiI UŁ Podstawy Programowania Programy różne w C++
XML – eXtensible Markup Language
Wzory skróconego mnożenia
Wykład 10 typ zbiorowy rekurencja.
Algorytmika Iteracje autor: Tadeusz Lachawiec.
Obliczalność czyli co da się policzyć i jak Model obliczeń maszyna licznikowa dr Kamila Barylska.
K URS JĘZYKA C++ – WYKŁAD 10 ( ) Szablony.
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Algorytmy- Wprowadzenie do programowania
Materiały pochodzą z Platformy Edukacyjnej Portalu
WYKŁAD 06 Programowanie dynamiczne Grażyna Mirkowska.
Krakowski Piotr, Woliński Radosław, Kowalski Piotr, Machowski Michał.
Zasady arytmetyki dwójkowej
Typy liczbowe, zmienne, operatory Zajęcia 4. Zmienne Zmienna – to w programowaniu element programu, który może mieć przypisaną pewną wartość (wartość.
Funkcje - rekurencja Zajęcia 8. Funkcje - definicja Ogólna postać funkcji w C++: typZwracany nazwaFunkcji(listaParametrówWejściowychFunkcji) { ciało funkcji.
Metody sztucznej inteligencji – technologie rozmyte i neuronoweReguła propagacji wstecznej  Dr hab. inż. Kazimierz Duzinkiewicz, Katedra Inżynierii Systemów.
Rozdział IV Wyrażenia proceduralne algorytmów Grzegorz Gacek Patryk Gajewski.
Od Feynmana do Google’a Rafał Demkowicz-Dobrzański,, Wydział Fizyki UW.
Programowanie I Rekurencja.
 Formuła to wyrażenie algebraiczne (wzór) określające jakie operacje ma wykonać program na danych. Może ona zawierać liczby, łańcuchy znaków, funkcje,
LICZBY NATURALNE I CAŁKOWITE. Liczby Naturalne Liczby naturalne – liczby używane powszechnie do liczenia (na obiedzie były trzy osoby) i ustalania kolejności.
Algorytmy. Co to jest algorytm? Przepis prowadzący do rozwiązania zadania.
Algorytmy, sposoby ich zapisu.1 Algorytm to uporządkowany opis postępowania przy rozwiązywaniu problemu z uwzględnieniem opisu danych oraz opisu kolejnych.
Deforestacja Metody optymalizacji dla języka SBQL Marta J. Burzańska 15 października 2009.
Liczbami naturalnymi nazywamy liczby 0,1,2,3,..., 127,... Liczby naturalne poznaliśmy już wcześniej; służą one do liczenia przedmiotów. Zbiór liczb.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Types and Typeclasses Syntax in Functions
Rekurencja - Haskell Bartosz Pawlak Sebastian Żółtowski Adam Stegenda Krystian Sobótka Tomasz Gołębiewski.
Strumienie, Wczytywanie, Zapisywanie, Operacje na plikach
Rozdział 5 REKURENCJA.
DEFINICJA I ZASTOSOWANIE W JĘZYKU HASKELL
Programowanie I Rekurencja.
Funkcje wyższego rzędu
Rekurencja Ponieważ w Haskellu nie mamy klasycznych pętli for czy while dlatego w wielu algorytmach musimy używać rekurencji.
Implementacja rekurencji w języku Haskell
Haskell Składnia funkcji.
PGO Przeciążanie metod i konstruktorów
Zapis prezentacji:

Haskell

Dopasowanie do wzorca Jest to operacja, gdzie pewnie wyrażenie sprawdza się ze wzorcem, w którym może znajdować się jedno lub więcej "wolnych miejsc". W wyniku, o ile nastąpiło dopasowanie otrzymuje się listę wyrażeń, które dopasowały się do wolnych miejsc wzorca. W językach funkcyjnych wykorzystuje się system wzorców symbolicznych.

Dopasowanie do wzorca Przykład: Aplikacja, która wypisze „Trafiłeś szczęśliwą liczbę” w przypadku napotkania siódemki, oraz „Liczba nie jest szczęśliwa” w przeciwnym wypadku. Plik szczesliwaLiczba.hs szczesliwaLiczba::(Integral a)=> a-> String szczesliwaLiczba 7 = "Trafiles szczesliwa liczbe." szczesliwaLiczba x = "Liczba nie jest szczesliwa. "

Dopasowanie do wzorca Ten sam przykład można zapisać w nieco inny sposób: szczesliwaLiczba n = case n of 7 -> "Trafiles szczesliwa liczbe." _ -> "Liczba nie jest szczeliwa" Lub szczesliwaLiczba n | n == 7 = " Trafiles szczesliwa liczbe. " | otherwise = " Liczba nie jest szczeliwa "

Dopasowanie do wzorca W kolejnym przykładzie sprawdzimy czy liczba mieści się w zakresie i wypiszemy ją jako string. Przykład: sayMe :: (Integral a) => a -> String sayMe 1 = "One!" sayMe 2 = "Two!" sayMe 3 = "Three!" sayMe 4 = "Four!" sayMe 5 = "Five!" sayMe x = "Not between 1 and 5"

Silnia rekurencyjnie Przypomnienie czym jest silnia: Jest to iloczyn wszystkich liczb naturalnych nie większych niż n. 4! = 1 · 2 · 3 · 4 = 24. Przypomnienie czym jest rekurencja: Odwoływanie się funkcji do samej siebie.

Silnia rekurencyjnie Przykład: fac :: Int -> Int fac n | n = 0" | n == 0 = 1 | otherwise = n * fac (n - 1)

Silnia rekurencyjnie – drugi sposób Przykład: factorial :: (Integral a) => a -> a factorial 0 = 1 factorial n = n * factorial (n - 1)

Silnia rekurencyjnie – drugi sposób Wyjaśnienie działania dla n=3. W pierwszym kroku obliczamy 3 * silnia(2) Silnia(2) to: 2 * silnia(1) Silnia(1) to 1 * Silnia(0) Co w sumie daje: 3 * (2 * (1 * silnia 0)) Z czego otrzymujemy 3 * (2 * (1 * 1)) Z tego wynika, że kolejność jest bardzo istotna!

Krotki na przykładzie wektorów Dodanie do siebie dwóch wektorów. Komponenty x muszą być dodane oddzielnie, oraz ich elementy y oddzielnie. addVectors :: (Num a) => (a, a) -> (a, a) -> (a, a) addVectors a b = (fst a + fst b, snd a + snd b) lub addVectors :: (Num a) => (a, a) -> (a, a) -> (a, a) addVectors (x1, y1) (x2, y2) = (x1 + x2, y1 + y2)

Krotki na przykładzie wektorów A co, jeśli chcielibyśmy użyć trójek? _ oznacza cokolwiek first :: (a, b, c) -> a first (x, _, _) = x second :: (a, b, c) -> b second (_, y, _) = y third :: (a, b, c) -> c third (_, _, z) = z Przykład: ghci > let xs = [(1,3), (4,3), (2,4), (5,3), (5,6), (3,1)] ghci > [a+b | (a,b) <- xs] [4,7,6,8,11,4]

Inne przykłady - listy head ' :: [a] -> a head ' [] = error "Can't call head on an empty list, dummy!" head ' (x:_) = x [] – oznacza listę pustą ghci > head ' [4,5,6] 4 ghci > head ' "Hello" 'H'

Inne przykłady - listy tell :: (Show a) => [a] -> String tell [] = "The list is empty" tell (x:[]) = "The list has one element: " ++ show x tell (x:y:[]) = "The list has two elements: " ++ show x ++ " and " ++ show y tell (x:y:_) = "This list is long. The first two elements are: " ++ show x ++ " and " ++ show y

Przykład z BMI bmiTell :: (RealFloat a) => a -> String bmiTell bmi | bmi <= 18.5 = "You're underweight, you emo, you!" | bmi <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!" | bmi <= 30.0 = "You're fat! Lose some weight, fatty!" | otherwise = "You're a whale, congratulations!„ bmiTell :: (RealFloat a) => a -> a -> String bmiTell weight height | weight / height ^ 2 <= 18.5 = "You're underweight, you emo, you!" | weight / height ^ 2 <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!" | weight / height ^ 2 <= 30.0 = "You're fat! Lose some weight, fatty!" | otherwise = "You're a whale, congratulations!" Let’s see if I’m fat... ghci > bmiTell "You're supposedly normal. Pffft, I bet you're ugly!"

Przykład z WHERE bmiTell :: (RealFloat a) => a -> a -> String bmiTell weight height | bmi <= 18.5 = "You're underweight, you emo, you!" | bmi <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!" | bmi <= 30.0 = "You're fat! Lose some weight, fatty!" | otherwise = "You're a whale, congratulations!" where bmi = weight / height ^ 2 Lub bmiTell :: (RealFloat a) => a -> a -> String bmiTell weight height | bmi <= skinny = "You're underweight, you emo, you!" | bmi <= normal = "You're supposedly normal. Pffft, I bet you're ugly!" | bmi <= fat = "You're fat! Lose some weight, fatty!" | otherwise = "You're a whale, congratulations!" where bmi = weight / height ^ 2 skinny = 18.5 normal = 25.0 fat = 30.0

Przykład z LET ghci > let zoot x y z = x * y + z ghci > zoot ghci > let boot x y z = x * y + z in boot

CASE case expression of pattern -> result pattern -> result...

CZĘŚĆ 2  REKURENCJA Żeby zrozumieć rekurencję, musisz zrozumieć rekurencję.

Silnia Ćwiczenie -> zaimplementować silnie, była już omawiana.

Mnożenie Z pewnością każdy programista, zarówno piszący w językach imperatywnych jak i funkcyjnych, aby pomnożyć dwie liczby a i b napisze po prostu a * b. Mnożenie można jednak zapisać w sposób rekurencyjny. Wykorzystamy do tego definicję podawaną dzieciom w szkole podstawowej. Aby pomnożyć liczbę a razy liczbę b, weź liczbę a i dodaj do siebie b razy. Na przykład 6*4 = Podobnie jak w poprzednim przykładzie, zapiszmy dwa przykłady mnożenia. 6 * 4 = * 3 =

Mnożenie – uogólnienie a * b = a + a * (b-1) Oraz przypadek bazowy a * 0 = 0

Implementacja Samodzielnie zaimplementuj pomnoz a 0 = 0 pomnoz a b = a + pomnoz a (b-1)

Maxiumum maksimum :: [Int] -> Int maksimum [x] = x maksimum (x:xs) | x > maks = x | otherwise = maks where maks = maksimum xs

Rekurencja ogonowa Rekurencja ogonowa, zwana też Tail call lub prawostronną jest rodzajem rekurencji, w której ostatnia operacja wykonywana przez funkcję to rekurencyjne wywołanie samej siebie lub zwrócenie końcowego wyniku. Taka funkcja może zostać łatwo zamieniona na iterację, zarówno ręcznie, jak i automatycznie, co redukuje wielkość stosu oraz zwiększa wydajność. Ta technika iteracyjnego wykonywania obliczeń jest powszechna w programowaniu funkcyjnym promującym używanie rekurencji, która w przeciwnym wypadku zajęłaby cały dostępny stos.

Rekurencja ogonowa maksimum' :: [Int] -> Int maksimum' (x:xs) = maks xs x where maks [] m = m maks (x:xs) m | x > m = maks xs x | otherwise = maks xs m