Rekurencja Ponieważ w Haskellu nie mamy klasycznych pętli for czy while dlatego w wielu algorytmach musimy używać rekurencji.

Slides:



Advertisements
Podobne prezentacje
Sortowanie przez scalanie
Advertisements

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.
Wykład nr 7: Synchronizacja procesów
Rzędy wielkości funkcji
Analiza kosztu zamortyzowanego
KOMPUTEROWE WSPOMAGANIE PRAC BADAWCZYCH FORTRAN 90/95 – cz II Adam FIC INSTYTUT TECHNIKI CIEPLEJ.
Podprogramy.
Typy złożone, case, stałe. Typ zbiorowy type typ_zb = set of typ_podstawowy; Typem podstawowym może być tylko typ porządkowy. Typem podstawowym może być
Schemat Hornera Mgr inż. Michał Szucki.
Algorytmy i struktury danych
Rekurencja.
Algorytmy i struktury danych
C# Platforma .NET CZ.3 Kuba Ostrowski.
Informatyka MZT1 Wykład 6 Iteracje while i repeat Tablice Rekordy
Wykład 10 typ zbiorowy rekurencja.
Ogólna struktura programu w TP
Krakowski Piotr, Woliński Radosław, Kowalski Piotr, Machowski Michał.
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.
Listy Listy w Prologu mogą przechowywać dane dowolnego typu [alpha,beta,gamma,delta] [1,2,3] Sama lista również może zawierać listę: [[a,list,within],a,list]
Temat 2: Podstawy programowania Algorytmy – 1 z 2 _________________________________________________________________________________________________________________.
STOS. STL (ang. Standard Template Library) jest to biblioteka zawierająca algorytmy, pojemniki, iteratory oraz inne konstrukcje w formie szablonów, gotowe.
Pakiety numeryczne Operatory, instrukcje sterujące, operacje bitowe Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania.
1 Dr Galina Cariowa. 2 Legenda Iteracyjne układy kombinacyjne Sumatory binarne Sumatory - substraktory binarne Funkcje i układy arytmetyczne Układy mnożące.
Stężenia Określają wzajemne ilości substancji wymieszanych ze sobą. Gdy substancje tworzą jednolite fazy to nazywa się je roztworami (np. roztwór cukru.
Excel 2007 dla średniozaawansowanych zajęcia z dnia
Zmienne losowe Zmienne losowe oznacza się dużymi literami alfabetu łacińskiego, na przykład X, Y, Z. Natomiast wartości jakie one przyjmują odpowiednio.
IEN 2010 © wszelkie prawa zastrzeżone SEMINARIUM Pakiet MATLAB w Zakładzie OGM Możliwości posiadanych produktów.
Karolina Supera Michał Krajewski. Struktura w formie drzewa Funktor jest węzłem Składniki struktur są gałęziami W strukturze możemy zagnieżdżać inne struktury.
Funkcja liniowa Przygotował: Kajetan Leszczyński Niepubliczne Gimnazjum Przy Młodzieżowym Ośrodku Wychowawczym Księży Orionistów W Warszawie Ul. Barska.
W KRAINIE TRAPEZÓW. W "Szkole Myślenia" stawiamy na umiejętność rozumowania, zadawania pytań badawczych, rozwiązywania problemów oraz wykorzystania wiedzy.
Algorytmy Informatyka Zakres rozszerzony
Pole wycinka kołowego r r α Wycinek kołowy, to część koła ograniczona dwoma promieniami. Skoro wycinek kołowy jest częścią koła, to jego pole jest częścią.
Zapytania ( 3.0 ) wyrażenia zapytaniowe - querry expressions przestrzeń nazw LINQ - Language-Integrated Query 3 etapy : 1. określenie źródła danych, 2.
 Przedziałem otwartym ( a;b ) nazywamy zbiór liczb rzeczywistych x spełniających układ nierówności x a, co krócej zapisujemy a
Hoopl Higher-order optimization library
Types and Typeclasses Syntax in Functions
Test analizy wariancji dla wielu średnich – klasyfikacja pojedyncza
Programowanie Obiektowe – Wykład 1
Rekurencja - Haskell Bartosz Pawlak Sebastian Żółtowski Adam Stegenda Krystian Sobótka Tomasz Gołębiewski.
Rozdział 5 REKURENCJA.
Listy.
DEFINICJA I ZASTOSOWANIE W JĘZYKU HASKELL
Typy i typy klas.
Liczby pierwsze.
Akademia C# - Lab2 Zmienne, instrukcje warunkowe, pętle, debugger,
Rekursje Tak jak w innych językach funkcje mogą odwoływać się same do siebie Możemy regulować głębokość przed stwierdzeniem błędu (MaxRecursion, $RecursionLimit,
Akademia C# lab. 9 Zdarzenia i delegaty.
Programowanie obiektowe Wykład 10
Kurs języka C++ – wykład 13 ( )
Elementy fizyki kwantowej i budowy materii
Obliczenia w Matlabie Operatory, instrukcje sterujące, operacje bitowe
Języki programowania.
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
Funktory, funktory aplikatywne, MONoidy
Temat: Pliki— miejsce na komputerowe informacje
Laboratorium 1 – obsługa wejść i wyjść
Instrukcje wyboru.
Podstawy informatyki Zygfryd Głowacz.
ALGORYTMY I STRUKTURY DANYCH
Pisemne dzielenie liczb naturalnych
ALGORYTMY I STRUKTURY DANYCH
PGO Kolekcje Michail Mokkas.
Dzielenie wielomianów
Implementacja rekurencji w języku Haskell
Doskonalenie rachunku pamięciowego u uczniów
REGRESJA WIELORAKA.
Bufory.
Język C++ Operatory Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła.
ALGORYTMY I STRUKTURY DANYCH
Zapis prezentacji:

Rekurencja Ponieważ w Haskellu nie mamy klasycznych pętli for czy while dlatego w wielu algorytmach musimy używać rekurencji.

Alborytm na n liczbe ciagu Fibonacciego: fib :: Integer -> Integer fib 0 = 0 fib 1 = 1 fib n = fib ( n - 2) +fib ( n - 1) Maximum: maximum' :: ( Ord a) => [a] -> a maximum' [] = error " maximum of empty list " maximum' [x] = x maximum' (x: xs ) (lub = max x ( maximum2 xs ) ) | x > maxTail = x | otherwise = maxTail where maxTail = maximum' xs Algorytm rekurencyjnego szukania maximu zwykle nie polaga na aktualizowaniu zmiennej przechowujacej potencjalny max podczas sprawdzania wszystkich elemntów ciagu. Algorytm maximum w haskellu polega na porównywaniu pierwszego elementu z ciagu z rekurencyjnym wywołaniem funkcji dla pozostałych elemntów. Przykład: [2,5,1] -> 2 ; [5, 1] -> 5 ; [1] -> 1

Replicate replicate' :: ( Num i , Ord i ) => i -> a -> [a] replicate' n x | n <= 0 = [] | otherwise = x:replicate' (n -1) x ( lub | otherwise = [x] ++ replicate‘ (n -1) x-} ) Użylismy tutaj starażnika zamiast wzorca ponieważ sprawdzamy warunek logiczny. Jeżeli n jest mniejsze lub równe zero zwracamy pustą listę. Przykład: replicate’ 3 5 -> [5, 5, 5] Take take ’ :: ( Num i , Ord i ) => i -> [a] -> [a] take ’ n _ take ’ _ [] = [] take ’ n (x: xs ) = x : take ’ (n -1) xs Przykład: take 3 [5,4,3,2,1] -> [5] : take 2 [4,3,2,1] -> [5,4] : take 1 [3,2,1] -> [5,4,3] : take 0 [2,1] -> [5,4,3]: [] -> [5,4,3]

Reverse Repeat reverse' :: [a] -> [a] reverse' [] = [] reverse' (x: xs ) = reverse' xs ++ [ x] Revarse polega na przepisywaniu pierwszego elmentu na koniec listy aż do przepisania wszystkich. Przykład: reverse [1,2,3] -> reverse [2,3] ++ [1] |reverse[3] ++[2] |[]++[3] Repeat repeat ’ :: a -> [a] repeat ’ x = x: repeat ’ x W Haskelu jeżeli w funkcji rekurencyjnej nie określimy warunku końca to w pwenych przypadkach funkcja taka da wynik nieskończony w powyższej funkcji wynik jest nieskończony i bedzie drukowany tak długo aż użytkownik tego nie przerwie. Mozemy zauważyć ze funkcje rekurencyjne w haskelu powstaja według pewnego schematu : Obsługujemy sytułacje wyjatkowe Obsługujemy główną właściwość algorytmu Funkcja wykonuje operacje na części danych a dla pozostałych wykonywane jest kolejne zagłębienie

Zip Elem zip ’ :: [a] -> [b] -> [( a ,b )] zip ’ _ [] = [] zip ’ (x: xs ) (y: ys ) = (x ,y ): zip ’ xs ys Przykład: zip [1,2,3] [’a’,’b’] -> [(1,’a’),(2,’b’)] Na początku alhotytm spawdza czy jedna z list jest pusta, jeżeli tak to zwarca pustą listę. W przeciwnym wypadku łączy głowy obu list w krotkę i dodaje do tablicy a dla ogonów uruchamia kolejne zagłębienie. Elem elem ’ :: ( Eq a) => a -> [a] -> Bool elem ’ a [] = False elem ’ a (x: xs ) | a == x = True | otherwise = a ‘ elem ’‘ xs (| otherwise = elem a xs) Przykład: elem 1 [1,2,3] -> True

QuickSort quicksort :: ( Ord a) => [a ] -> [a ] quicksort (x: xs ) = let smallerSorted = quicksort [a | a <- xs , a <= x] biggerSorted = quicksort [a | a <- xs , a > x] in smallerSorted ++ [x] ++ biggerSorted Przykład: quicksort [5,1,9,4,6,7,3] -> quicksort [1,4,3] ++ [5] ++ quicksort [9,6,7] quicksort [1,4,3] -> quicksort [] ++ [1] ++ quicksort [4, 3 ] quicksort [9,6,7] -> quicksort [6,7] ++ [9] ++ quicksort [] quicksort [4,3] -> quicksort [3] ++ [4] ++ quicksort [] quicksort [6,7] -> quicksort [] ++ [6] ++ quicksort [7]