HASKELL 2 R O Z D Z I A Ł 4 SKŁADNIA W FUNKCJACH R O Z D Z I A Ł 5 REKURENCJA. Learn You a Haskell for Great Good! Miran Lipovac

Wielkość: px
Rozpocząć pokaz od strony:

Download "HASKELL 2 R O Z D Z I A Ł 4 SKŁADNIA W FUNKCJACH R O Z D Z I A Ł 5 REKURENCJA. Learn You a Haskell for Great Good! Miran Lipovac"

Transkrypt

1 HASKELL 2 R O Z D Z I A Ł 4 SKŁADNIA W FUNKCJACH R O Z D Z I A Ł 5 REKURENCJA Learn You a Haskell for Great Good! Miran Lipovac

2 ROZDZIAŁ 4 ODNAJDYWANIE WZORCA (P ATTERN MATCHING)

3 CZYM JEST PATTERN MATCHING? Odnajdywanie wzorca, czy też bardziej popularna nazwa pattern matching polega na sprecyzowaniu wzorców, dla których niektóre dane powinny być zgodne, sprawdzeniu wzorców oraz rozkładzie danych zgodnie z wzorcami. Możliwe jest definiowanie oddzielnych funkcji dla różnych wzorców. Umożliwia to przekierowywanie z poszczególnych typów danych do innych, np. z int'a do list, znaków itp.

4 Przykładowa funkcja przedstawiająca przypisanie ciągów do liczb: test:: ( Integral a) => a -> String test 0 = " To zdanie jest fałszywe" test 1 = " To zdanie jest prawdziwe" test x = " To nie jest zdanie logiczne"

5 Gdy zostanie wywołana funkcja test wzorzec zostanie sprawdzony od góry do dołu. W przypadku, gdy odnajdzie on pasujący wzorzec zostanie użyta odpowiednia funkcja (w tym przypadku wyświetli jeden z napisów). Jeśli liczba testowana wynosi 0, sprawdzanie patternu zatrzyma się już na pierwszej funkcji odpowiadającej tej liczbie (mimo iż 0 zawiera się również w "x") i wyświetli napis " To zdanie jest fałszywe. Jeśli jednak spróbujemy odnaleźć wzorzec dla jakiejkolwiek liczby spoza systemu binarnego, pierwszą odpowiadającą funkcją będzie dopiero ta w 4 linijce - " To nie jest zdanie logiczne".

6 Oczywiście funkcja tego rodzaju mogłaby w bardzo prosty sposób być zastąpiona funkcja IF, jednakże użycie wzorców jest idealnym rozwiązaniem, gdy mamy więcej funkcji. Oto przykładowy wzorzec przypisujący nazwę dnia tygodnia do numeru dnia tygodnia: week:: ( Integral a) => a -> String week 1 = " Poniedzialek " week 2 = " Wtorek " week 3 = " Sroda " week 4 = " Czwartek " week 5 = " Piatek " week 5 = " Sobota " week 5 = " Niedziela " week x = " To nie jest liczba z przedzialu 1-7"

7 Bardzo podobne do wzorców jest funkcja switch w programowaniu proceduralnym, oto jej przykład zastosowania w jeżyku c++ switch (week) { case "1": cout << "Poniedzialek"; break; case "2": cout << "Wtorek "; break; case "3": cout << "Sroda "; break; case "4": cout << "Czwartek "; break; case "5": cout << "Piatek"; break; case "6": cout << "Sobota"; break; case "7": cout << "Niedziela"; break; default: cout<< " To nie jest liczba z przedzialu 1-7"; break; }

8 To, co odróżnia je od siebie to kolejność czytania, w switchu wszystkie przypadki (case) są równoważne, natomiast gdybyśmy w wzorcu zamienili linijkę 2 i 9 napis " To nie jest liczba z przedziału 1-7" byłby wyświetlany dla każdej liczby. week:: ( Integral a) => a -> String week x = " To nie jest liczba z przedzialu 1-7" week 2 = " Wtorek " week 3 = " Sroda " week 4 = " Czwartek " week 5 = " Piatek " week 5 = " Sobota " week 5 = " Niedziela " week 1 = " Poniedzialek "

9 Wzorce umożliwiają również pisanie funkcji rekurencyjnych, jak np. silnia silnia:: ( Integral a ) => a -> a silnia 0 = 1 silnia n = n * silnia ( n - 1) Dzięki temu ze najpierw zdefiniowaliśmy silnie dla 1, wzorzec nie będzie próbował liczyć silni -1, bo zatrzyma się na silnia 0. Gdyby nie to, nasza rekurencja była by nieskończona.

10 Oczywiście, jeśli poszukujemy wzorca, który nie został przez nas wcześniej zdefiniowany otrzymamy błąd. imie:: Char -> String imie'a ' = " Rafal " imie'b ' = " Lukasz " imie'c ' = Michal

11 ghci > charname 'a ' Rafal ghci > charname 'b ' Lukasz ghci > charname 'h ' *** Exception: tut. hs :(53,0) -(55,21): Non - exhaustive patterns in function charname Program informuje nas o tym ze nie znalazł żadnego wyjścia przypisanego do wejścia, które mu podaliśmy. Dlatego należy dodawać na końcu wzorca jakiś odpowiednik "default a" z switcha, czyli np.: imie x = "Nie ma takiego wpisu". Unikniemy w ten sposób błędów oraz niespodziewanych efektów.

12 Odnajdywanie wzorców może być również stosowane na krotkach. Oto przykład funkcji, do której wpisujemy dwa wektory opisane na dwu wymiarowej przestrzeni. Jej zadaniem jest obliczenie sumy wektorowej. Należałoby zsumować pierwsze liczby obu wektorów i drugie liczby wektorów oddzielnie. Nie używając wzorców, można to zrobić w następujący sposób: suma :: ( Num a ) = > (x, x) -> (x, x) -> (x, x) suma x y = ( fst x + fst y, snd x + snd y)

13 Sposób jak najbardziej działający, ale niezbyt optymalny, szczególnie przy bardziej złożonych krotkach. Ta sama funkcja zbudowana za pomocą odnajdywania wzorców wyglądałaby następująco: suma :: ( Num a) = > (a, a) -> (a, a) -> (a, a) suma (x1, y1 ) (x2, y2 ) = ( x1 + x2, y1 + y2 )

14 Metoda ta jest o wiele bardziej optymalna, gdyż równie łatwo można ja zastosować do większych krotek. Tak wyglądałaby funkcja tego typu dla trzy liczbowego wektora: frst:: (a, b, c) -> a frst(x, _, _ ) = x scnd:: (a, b, c) -> b scnd(_, y, _) = y thrd:: (a, b, c) -> c thrd(_, _, z ) = z

15 WZORCE UMOŻLIWIAJĄ TEZ ZDEFINIOWANIE LISTY ARGUMENTÓW, Z KTÓREJ KORZYSTA FUNKCJA 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] Definiujemy xs jako listę wektorów 2 stopnia oraz przypisujemy ta listę do dwóch zmiennych. W wypadku, gdy program nie odnajdzie odpowiedniego wzorca, przemieszcza się do kolejnego elementu.

16 Listy same w sobie mogą być użyte do stworzenia wzorca, np. x:xs przypisze head listy do x'a, natomiast cala resztę listy do xs, nawet jeśli lista jest jednoelementowa, czyli xs stanie się lista pusta. Rozwiązanie to znajduje swoje zastosowanie w tworzeniu funkcji rekurencyjnych. Jeśli np. chcemy przypisać trzy pierwsze elementy listy do trzech różnych zmiennych i resztę listy do czwartej zmiennej, wystarczy użyć x:y:z:zs, ważne zęby pamiętać ze listy porównywane z tym wzorcem musza mieć co najmniej 3 elementy.

17 Znając te rozwiązania możemy stworzyć nasza własna funkcje "head : head ' :: [a] -> a head ' [] = error " Pierwszy element pustej listy? To raczej nie zadziała..." head ' (x: _) = x A oto nasza własna funkcja lenght: length ' :: ( Num b) => [a] -> b length ' [] = 0 length ' ( _: xs ) = 1 + length ' xs

18 Oczywiście dla pustej listy lenght będzie wynosił 0. Jak widać jest to funkcja rekurencyjna, która usuwa pierwszy element listy i zwiększa lenght o 1, aż lista będzie pusta? Spójrzmy jak wygląda implementacja funkcji sum: sum ' :: ( Num a) => [a] -> a sum ' [] = 0 sum ' (x: xs ) = x + sum ' xs Oczywiście dla pustej listy suma będzie wynosić 0. Wiemy również, ze suma całej listy to suma head oraz reszty listy, wiec znów zapętlamy ten wzorzec rekurencyjnie.

19 Jeśli chcemy wyświetlić listę, którą podzieliliśmy na np. (x:y:ys) to możemy ją przypisać do zmiennej przy pomocy w następujący sposób: Dzięki temu, gdy wywołamy all wyświetli nam się cała lista i nie musimy wypisywać oddzielnie x : y : ys. Oto przykład zastosowania tego triku: capital :: String -> String capital "" = " Yup... it's empty..." capital all@ (x : xs ) = " The first letter of " ++ all ++ " is " ++ [ x]

20 ROZDZIAŁ 4 STRAŻNICY (G UARDS)

21 KIM (CZYM) SĄ STRAŻNICY? Strażnicy działają podobnie do funkcji IF - zwracają wartość 0 lub 1 dla (odpowiednio) fałszu oraz prawdy. Od IF'a różnią się przede wszystkim przejrzystością, czytelnością, ale także umożliwiają sprawdzanie więcej niż jednego zdania logicznego.

22 Oto przykład przedstawiający jego zastosowanie: bmitell :: ( RealFloat a) => a -> String bmitell bmi bmi <= 18.5 = " Waga piorkowa!" bmi <= 25.0 = " jest dobrze!" bmi <= 30.0 = " prawie tyle co maly fiat!" otherwise = " wiecej niz maly fiat?! o.0"

23 Podczas sprawdzania strażnika program będzie przypisywał wartości logiczne kolejnym linijkom. Jeśli wartość ta będzie równa 0, to program przejdzie do następnej linijki. Natomiast, jeśli wartość ta będzie wynosiła 1, ta linijka zostanie wyświetlona. Czyli gdybyśmy przyjęli bmi = 24.3 program sprawdzi czy 24.3 jest mniejsze/równe Jako iż nie jest to prawda przejdzie do następnej linijki i sprawdzi czy 24.3 jest mniejsze/równe 25. Jest to prawda, wiec wyświetli zdanie " jest dobrze!"

24 Jest to porównywalne z wielkim drzewem IF ów i ELSE'ów w programowaniu imperatywnym, jednak jest dużo bardziej przejrzyste oraz lepiej zoptymalizowane. W wielu przypadkach ostatnim strażnikiem jest otherwise. Jest on odpowiednikiem defaultu z slajdu 7 i zapobiega on wszelkiego rodzaju błędom oraz niespodziewanym wynikom.

25 Innym przykładem jest nasza własna implementacja funkcji max: max ' :: (Ord a) => a -> a -> a max ' a b a > b = a otherwise = b

26 Kolejnym przykładem zastosowania strażników będzie nasza implementacja funkcji compare: mycompare :: ( Ord a) => a -> a -> Ordering a ` mycompare ` b a > b = GT a == b = EQ otherwise = LT

27 ROZDZIAŁ 4 WHERE?

28 ABY UNIKNĄĆ WIELOKROTNEGO OBLICZANIA TEGO SAMEGO, MOŻNA PRZYPISAĆ TO OBLICZENIE DO ZMIENNEJ W NASTĘPUJĄCY SPOSÓB: bmitell :: ( RealFloat a) => a -> a -> String bmitell weight height bmi <= 18.5 = " Waga piorkowa!" bmi <= 25.0 = " jest dobrze!" bmi <= 30.0 = " prawie tyle co maly fiat!" o.0"" otherwise = " wiecej niz maly fiat?! where bmi = weight / height ^ 2

29 Dzięki umieszczeniu where na końcu cały strażnik jest dużo bardziej czytelny i możemy zmienić sposób obliczania bmi robiąc to tylko raz. Where pozwala na dodanie więcej niż jednego wiązania: bmitell :: ( RealFloat a) => a -> a -> String bmitell weight height bmi <= 18.5 = " Waga piorkowa!" bmi <= 25.0 = " jest dobrze!" bmi <= 30.0 = " prawie tyle co maly fiat!" otherwise = " wiecej niz maly fiat?! o.0"" where bmi = weight / height ^ 2 skinny = 18.5 normal = 25.0 fat = 30.0

30 Dzięki temu wszystkie zmienne opisane są w jednym miejscu, co sprawia że strażnik jest jeszcze bardziej przejrzysty. Ważne jest, aby wszystkie te nazwy były w tej samej kolumnie, w innym przypadku Haskell nie wiedziałby, że wszystkie te zmienne są częścią tego samego bloku. Wiązania where nie są wspólne dla wielu strażników, jeśli potrzebujemy jednego wiązania dla kilku strażników należy zdefiniować globalnego where.

31 Wiązania where można też użyć do odnajdywania wzorców: bmitell :: ( RealFloat a) => a -> a -> String bmitell weight height bmi <= 18.5 = " Waga piorkowa!" bmi <= 25.0 = " jest dobrze!" bmi <= 30.0 = " prawie tyle co maly fiat!" otherwise = " wiecej niz maly fiat?! o.0"" where bmi = weight / height ^ 2 ( skinny, normal, fat ) = (18.5, 25.0, 30.0)

32 Kolejnym przykładem będzie funkcja oddająca inicjały po wprowadzeniu imienia oraz nazwiska: inicjaly :: String -> String -> String inicjaly imie nazwisko= [f ] ++ ". " ++ [l] ++ ". " where (f :_) = imie (l: _) = nazwisko

33 W wiązaniach where można tez umieszczać definicje funkcji: calcbmis :: ( RealFloat a ) = > [(a, a )] -> [a] calcbmis xs = [ bmi w h (w, h) <- xs ] where bmi weight height = weight / height ^ 2

34 ROZDZIAŁ 4 LET I T B E

35 Wiązania let są podobne do wiązań where, ale nie rozprzestrzeniają się na całego guarda, czy wzór, są bardzo lokalne. Wykorzystuje się je głownie do przypisywania wartości do zmiennych. Oto przykładowa funkcja obliczająca powierzchnie stożka: cylinder :: ( RealFloat a) =& gt ; a -& gt ; a -& gt ; a cylinder r h = let sidearea = 2 * pi * r * h toparea = pi * r ^2 in sidearea + 2 * toparea

36 KONSTRUKCJA LET Let <wiązania> in <wyrażenie> Wyrażenia definiowane w let są dostępne po "in". Znów ważne jest to, aby wszystkie definiowane zmienne były w jednej kolumnie. Wiec jaka jest różnica pomiędzy let a where? Przede wszystkim w let najpierw definiujemy wiązania, a potem ich używamy w wyrażeniu, natomiast w where jest odwrotnie. Zmieniają się też wyrażenia same w sobie, w where mogliśmy wstawiać tylko konstrukcje składniowe, natomiast w let mogą być całymi wyrażeniami.

37 ghci > 4 * ( let a = 9 in a + 1) Wewnątrz let zawiera się cala funkcja rekurencyjna. Jeśli chcemy zdefiniować wiele zmiennych naraz, a nie możemy tego zrobić w kolumnie, możemy je też oddzielać średnikiem: ghci > ( let a = 100; b = 200; c = 300 in a *b*c, let foo =" Hey "; bar = " there!" in foo ++ bar ) ( , " Hey there!")

38 Można tez przeszukiwać wzorce przy pomocy let ghci > ( let (a,b,c ) = (1,2,3) in a + b + c) * Let może tez być stosowany przy tworzeniu list: calcbmis :: ( RealFloat a) = > [(a, a )] -> [a] calcbmis xs = [ bmi (w, h) <- xs, let bmi = w / h ^ 2] Używamy let'a w orzeczeniu, ale zamiast filtrować nasza listę, let przypisuje wagę oraz wzrost do danego bmi.

39 Gdybyśmy chcieli jeszcze filtrować taka listę, należałoby dopisać warunek filtrowania po przecinku: calcbmis :: ( RealFloat a ) = > [(a, a )] -> [a] calcbmis xs = [ bmi (w, h) <- xs, let bmi = w / h ^ 2, bmi >= 25.0] W tworzeniu listy nie używamy in, ponieważ to, do której funkcji używane są zmienne definiowane w let jest predefiniowane przez listę.

40 Jeśli pominiemy in gdziekolwiek indziej, definicje z let'a zostaną na stale: ghci > let zoot x y z = x * y + z ghci > zoot ghci > let boot x y z = x * y + z in boot ghci > boot < interactive >:1:0: Not in scope : ` boot '

41 ROZDZIAŁ 4 C ASE E X P RESSIONS

42 CZYM JEST CASE EXPRESSIONS? Case expressions to wyrażenia najbardziej podobne do czasów z programowania imperatywnego, o których mówiliśmy na początku wykładu:

43 switch (week) { case "1": cout << "Poniedzialek"; break; case "2": cout << "Wtorek "; break; case "3": cout << "Sroda "; break; case "4": cout << "Czwartek "; break; case "5": cout << "Piatek"; break; case "6": cout << "Sobota"; break; case "7": cout << "Niedziela"; break; default: cout<< " To nie jest liczba z przedzialu 1-7"; break; }

44 Haskell posuwa ten koncept o krok na przód, case expressions pozwalają nam na wykorzystanie wszystkiego tego, czego nauczyliśmy się na tym wykładzie naraz. Składnia case expressions jest bardzo prosta: case wyrażenie of wzór-> rezultat wzór-> rezultat wzór-> rezultat...

45 Gdzie wyrażenie jest porównywane z wzorem i oczywiście egzekwowanie odpowiedniego rezultatu np. head ' :: [a] -> a head ' xs = case xs of [] -> error " pusta lista!" (x: _) -> x

46 Case sprawdza czy lista jest pusta, jeśli nie to wypisuje jej pierwszy element. Case expressions są bardzo elastyczne i można ich użyć praktycznie w dowolnym miejscu. describelist :: [a ] -> String describelist xs = " The list is " ++ case xs of [] -> " empty." [x] -> "a singleton list. " xs -> "a longer list."

47 Można to też zdefiniować w następujący sposób: describelist :: [a ] -> String describelist xs = " The list is " ++ what xs where what [] = " empty." what [x] = " a singleton list." what xs = "a longer list."

48 ROZDZIAŁ 5 REKURENCJA

49 CZYM JEST REKURENCJA? Rekurencja zwana rekursją, polega na wywołaniu przez funkcję samej siebie. Algorytmy rekurencyjne zastępują w pewnym sensie iteracje. Zazwyczaj zadania rozwiązywane tą techniką są wolniejsze od iteracyjnego odpowiednika, natomiast rozwiązanie niektórych problemów jest znacznie wygodniejsze. Rekurencja jest często stosowana w matematyce.

50 Przykładem rekurencji może być ciąg Fibonacci'ego, gdzie każdy kolejny wyraz ciągu jest sumą dwóch poprzednich. Zauważmy że dwa pierwsze elementy ciągu musimy wyznaczyć bez rekurencji. F0=0 F1=1 Fn=Fn-1+Fn-2, dla n 2 Początkowe wartości tego ciągu to: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,...

51 Rekurencja jest bardzo ważna dla Haskella, gdyż (w przeciwieństwie do języków imperatywnych) w tym języku nie jest możliwa zmiana wartości zmiennej. W związku z powyższym - nie możemy stosować pętli i jesteśmy zmuszeni do korzystania z rekurencji.

52 ROZDZIAŁ 5 FUNKCJA MAXIMUM

53 FUNKCJA MAXIMUM Funkcja maximum przyjmuje listę rzeczy, które mogą być zestawione ze sobą w celu wybrania największej z nich.

54 W TAKIM RAZIE JAKBYŚMY ZAIMPLEMENTOWALI FUNKCJĘ MAXIMUM W JĘZYKU IMPERATYWNYM? Prawdopodobnie stworzylibyśmy zmienną, która przechowywałaby największe wartości oraz pętlę, która przy wykonywaniu sprawdzałaby elementy listy. Jeśli sprawdzany aktualnie element listy jest większy od aktualnej maksymalnej wartości, wtedy zapisujemy ten element do naszej zmiennej. Kiedy pętla przestanie się wykonywać ostatni wynik jest naszym rozwiązaniem!

55 SPRÓBUJMY TERAZ ROZWIĄZAĆ TEN PROBLEM REKURENCYJNIE. Najpierw ustalamy nasz warunek końcowy, czyli wartość maksymalna z listy Singleton jest równa jedynemu elementowi w tej liście. Następnie mówimy, że maximum naszej listy jest głową, jeżeli głowa ta jest większa od maximum ogona. Jeśli jednak maximum ogona jest większe od głowy, wtedy sprawdzamy jeszcze raz maximum ogona.

56 PORA TO ZAIMPLEMENTOWAĆ W HASKELLU! maximum ' :: ( Ord a) => [a] -> a maximum ' [] = error " maximum of empty list " maximum ' [x] = x maximum ' (x: xs ) x > maxtail = x otherwise = maxtail where maxtail = maximum ' xs

57 Pierwszy warunek końcowy zwraca błąd jeśli nasza lista jest pusta. W wypadku jeśli jest to lista Singleton - wynikiem będzie ten jeden element. W trzecim warunku końcowym rozłączamy naszą listę na głowę i ogon. Używamy funkcji where w celu zdefiniowania funkcji maxtail, jako maximum reszty listy, a następnie sprawdzamy warunek (if) czy głowa jest większa od reszty listy. Jeśli tak- zwracamy głowę jako wynik. W innym wypadku zwracamy maximum reszty listy.

58 ŁATWIEJSZY ZAPIS Z UŻYCIEM FUNKCJI MAX maximum ' :: ( Ord a) => [a] -> a maximum ' [] = error " maximum of empty list " maximum ' [x] = x maximum ' (x: xs ) = max x ( maximum ' xs )

59 ROZDZIAŁ 5 K I L K A D O D A T K O W Y C H F U N K C J I O P A R T Y C H N A R E K U R E N C J I

60 REPLIKACJA Funkcja replikacja pobiera dwie wartości, z czego pierwsza to int i zwraca listę powtarzających się elementów. Przykładowo wywołując funkcję: replicate 3 5 zwraca nam listę [5,5,5]

61 PRZYKŁAD REPLIKACJI replicate ' :: ( Num i, Ord i ) => i -> a -> [a] replicate ' n x n <= 0 = [] warunek końcowy naszej rekurencji otherwise = x: replicate ' (n -1) x Zwracamy listę zaczynającą się kolejno od x, a potem powtarzamy czynność aż do osiągnięcia warunku końcowego.

62 FUNKCJA TAKE Funkcja pobiera daną liczbę elementów listy. Przykładowo wywołując funkcję: take 3 [5,4,3,2,1] Otrzymamy listę [5,4,3]

63 PRZYKŁAD FUNKCJI TAKE take ' :: ( Num i, Ord i ) => i -> [a] -> [a] take ' n _ używamy symbolu _ ponieważ nie interesuje nas co znajduje się w liście, sprawdzamy tylko czy n<=0 n <= 0 = [] take ' _ [] = [] pusta lista na wejściu, czyli zwracamy pustą listę take ' n (x: xs ) = x : take ' (n -1) xs W tym przypadku wykorzystujemy n oraz od razu rozbijamy listę na znany nam już ogon i głowę. Bierzemy pierwszy element listy i łączymy go poprzez rekurencję (n-1) razy z pozostałymi elementami.

64 REWERSJA Dzięki tej funkcji mamy możliwość tworzenia nieskończonych list. Zaletą list jest możliwość cięcia ich w dowolnym miejscu. Przykładowo wywołując funkcję: reverse ' :: [a] -> [a] reverse ' [] = [] reverse ' (x: xs ) = reverse ' xs ++ [ x] zamieniamy miejscami głowę i ogon.

65 STWÓRZMY LISTĘ NIESKOŃCZONĄ! repeat ' :: a -> [a] repeat ' x = x: repeat ' x

66 FUNKCJA ZIP Funkcja ZIP ma za zadanie połączyć w pary kolejne elementy list.

67 zip ' :: [a] -> [b] -> [( a,b )] zip ' _ [] = [] zip ' [] _ = [] jesli któraś z list jest pusta to zwracamy pustą listę zip ' (x: xs ) (y: ys ) = (x,y ): zip ' xs ys W ostatniej linijce występuje łączenie list. Zauważmy że jeśli mamy listy wejściowe o różnych wielkościach to lista większa będzie obcięta do wielkości mniejszej listy.

68 ROZDZIAŁ 5 SZYBKIE SORTOWANIE

69 QUICKSORT Quicksort, zwany także szybkim sortowaniem jest algorytmem, dzięki któremu możemy uszeregować rzeczy w danej liście. Jest on pewnego rodzaju znakiem rozpoznawczym Haskella.

70 STRUKTURA QUICKSORT quicksort :: (Ord a) => [a] -> [a] Posortowaną listą nazywamy taką listę, której wszystkie elementy są mniejsze bądź równe największemu elementowi. Następnie zaczynając od pierwszej liczby sprawdzamy czy każda następna jest większa od poprzedniej.

71 LISTA SKŁADANA quicksort :: ( Ord a) => [a] -> [a] quicksort [] = [] quicksort (x:xs) = let smallersorted = quicksort [a a <- xs, a <= x] biggersorted = quicksort [a a <- xs, a > x] in smallersorted ++ [x] ++ biggersorted

72 PRZYKŁADY ghci > quicksort [10,2,5,3,1,6,7,4,2,3,4,8,9] [1,2,2,3,3,4,4,5,6,7,8,9,10] ghci > quicksort " the quick brown fox jumps over the lazy dog " " abcdeeefghhijklmnoooopqrrsttuuvwxyz "

73 ROZDZIAŁ 5 MYŚLENIE REKURENCYJNE

74 Wykonaliśmy już trochę działań za pomocą rekurencji i powinniśmy zauważać już pewną zależność. Zazwyczaj definiujemy warunek końcowy, po czym definiujemy funkcję, która wykonuje operacje pomiędzy niektórymi elementami względem reszty. Nie ma znaczenia czy to jest drzewo, lista, czy inna struktura danych. Oczywiście mamy warunki końcowe. Zazwyczaj warunkiem końcowym jest punkt, gdzie rekurencja traci sens (otrzymujemy ten sam wynik cały czas). W przypadku list, najczęściej warunkiem końcowym jest pusta lista. W przypadku drzew - jest to punkt bez żadnych dzieci.

75 W szybkim sortowaniu warunkiem końcowym jest pusta lista, którą rozpoznajemy po tym, że jeżeli dodamy ją do innej listy to otrzymamy ponownie oryginalną listę. Żeby myśleć rekurencyjne za warunek końcowy musimy uznać moment, w którym rekurencja nie zostaje użyta. Musimy także pamiętać o danych, z których będziemy korzystać, rozłożeniu parametrów funkcji oraz momencie, w którym użyjemy rekurencji.

76 KONIEC Bibliografia: Learn You a Haskell for Great Good! Miran Lipovac Autorzy prezentacji: Przemek Cyliński Piotr Podgórski Michał Witkowski Natalia Zmysłowska

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał REKURENCJA W JĘZYKU HASKELL Autor: Walczak Michał CZYM JEST REKURENCJA? Rekurencja zwana rekursją, polega na wywołaniu przez funkcję samej siebie. Algorytmy rekurencyjne zastępują w pewnym sensie iteracje.

Bardziej szczegółowo

Składnia funkcji i Rekurencja w języku Haskell

Składnia funkcji i Rekurencja w języku Haskell Składnia funkcji i w języku Haskell Tomasz Ostrowski, Adrian Niechciał, Michał Workiewicz, Marcin Wilk 26 marca 2015 Składnia funkcji i w języku Haskell Spis treści Składnia funkcji Tomasz Ostrowski Adrian

Bardziej szczegółowo

Typy, klasy typów, składnie w funkcji

Typy, klasy typów, składnie w funkcji Typy, klasy typów, składnie w funkcji Typy w Haskell Każde wyrażenie w Haskell posiada zdefiniowany typ. Dzięki temu już na etapie kompilacji kodu następuje sprawdzenie poprawności kodu i zabezpiecza nas

Bardziej szczegółowo

- nawiasy kwadratowe oznaczają, że to lista

- nawiasy kwadratowe oznaczają, że to lista Haskell jest statycznym typem języka: - wszystkie typy i wyrażenia są znane w czasie kompilacji ( zwiększa to bezpieczeństwo kodu). Podawanie typów zmiennych i argumentów funkcji jest zbędne, gdyż Haskel

Bardziej szczegółowo

7. Pętle for. Przykłady

7. Pętle for. Przykłady . Pętle for Przykłady.1. Bez użycia pętli while ani rekurencji, napisz program, który wypisze na ekran kolejne liczby naturalne od 0 do pewnego danego n. 5 int n; 6 cin >> n; 8 for (int i = 0; i

Bardziej szczegółowo

Podstawy programowania funkcjonalnego

Podstawy programowania funkcjonalnego Podstawy programowania funkcjonalnego haskell.mariuszrozycki.pl Mariusz Różycki Churchill College, University of Cambridge rev. 2014.03.27.1 Wprowadzenie Materiały haskell.mariuszrozycki.pl Slajdy (w tym

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD programowania Wykład: 4 Instrukcje sterujące, operatory 1 programowania w C++ Instrukcje sterujące 2 Pętla for for ( instrukcja_ini ; wyrazenie_warunkowe ; instrukcja_krok ) tresc_petli ; instrukcja_ini

Bardziej szczegółowo

Rekurencja (rekursja)

Rekurencja (rekursja) Rekurencja (rekursja) Rekurencja wywołanie funkcji przez nią samą wewnątrz ciała funkcji. Rekurencja może być pośrednia funkcja jest wywoływana przez inną funkcję, wywołaną (pośrednio lub bezpośrednio)

Bardziej szczegółowo

Programowanie komputerowe. Zajęcia 3

Programowanie komputerowe. Zajęcia 3 Programowanie komputerowe Zajęcia 3 Instrukcje przypisania Poza zwykłą instrukcją przypisania, powodującą ustawienie wartości zmiennej na podane wyrażenie, istnieje wiele innych, np. += dodaj, a+=b jest

Bardziej szczegółowo

Definicje wyższego poziomu

Definicje wyższego poziomu Definicje wyższego poziomu Interpreter Scheme-a nie będzie narzekad w przypadku wystąpienia niezdefionowanej zmiennej w ciele wyrażenia lambda dopóki nie będzie zastosowana Przykład braku informacji o

Bardziej szczegółowo

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne dr inż. Marcin Szlenk Politechnika Warszawska Wydział Elektroniki i Technik Informacyjnych m.szlenk@elka.pw.edu.pl Paradygmaty

Bardziej szczegółowo

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy Wykład 3, część 3 1 Język JAVA podstawy Plan wykładu: 1. Konstrukcja kodu programów w Javie 2. Identyfikatory, zmienne 3. Typy danych 4. Operatory, instrukcje sterujące instrukcja warunkowe,

Bardziej szczegółowo

Programowanie strukturalne i obiektowe. Funkcje

Programowanie strukturalne i obiektowe. Funkcje Funkcje Często w programach spotykamy się z sytuacją, kiedy chcemy wykonać określoną czynność kilka razy np. dodać dwie liczby w trzech miejscach w programie. Oczywiście moglibyśmy to zrobić pisząc trzy

Bardziej szczegółowo

Programowanie - wykład 4

Programowanie - wykład 4 Programowanie - wykład 4 Filip Sośnicki Wydział Fizyki Uniwersytet Warszawski 20.03.2019 Przypomnienie Prosty program liczący i wyświeltający wartość silni dla wprowadzonej z klawiatury liczby: 1 # include

Bardziej szczegółowo

6. Pętle while. Przykłady

6. Pętle while. Przykłady 6. Pętle while Przykłady 6.1. Napisz program, który, bez użycia rekurencji, wypisze na ekran liczby naturalne od pewnego danego n do 0 włącznie, w kolejności malejącej, po jednej liczbie na linię. Uwaga!

Bardziej szczegółowo

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst. Schematy blokowe I Jeżeli po schematach blokowych będzie używany język C, to należy używać operatorów: '&&', ' ', '!=', '%' natomiast jeśli Ruby to 'and', 'or', '%', '!='. 1. Dostępne bloki: a) początek:

Bardziej szczegółowo

4. Funkcje. Przykłady

4. Funkcje. Przykłady 4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni

Bardziej szczegółowo

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych 1. Wstawianie skryptu na stroną: Laboratorium 1 Do umieszczenia skryptów na stronie służy znacznik: //dla HTML5 ...instrukcje skryptu //dla HTML4 ...instrukcje

Bardziej szczegółowo

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na

Bardziej szczegółowo

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja Opis zagadnieo 1-3 Iteracja, rekurencja i ich realizacja Iteracja Iteracja to czynnośd powtarzania (najczęściej wielokrotnego) tej samej instrukcji (albo wielu instrukcji) w pętli. Mianem iteracji określa

Bardziej szczegółowo

lekcja 8a Gry komputerowe MasterMind

lekcja 8a Gry komputerowe MasterMind lekcja 8a Gry komputerowe MasterMind Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych

Bardziej szczegółowo

Pętle. Dodał Administrator niedziela, 14 marzec :27

Pętle. Dodał Administrator niedziela, 14 marzec :27 Pętlami nazywamy konstrukcje języka, które pozwalają na wielokrotne wykonywanie powtarzających się instrukcji. Przykładowo, jeśli trzeba 10 razy wyświetlić na ekranie pewien napis, to można wykorzystać

Bardziej szczegółowo

WHILE (wyrażenie) instrukcja;

WHILE (wyrażenie) instrukcja; INSTRUKCJE ITERACYJNE WHILE, DO WHILE, FOR Instrukcje iteracyjne pozwalają powtarzać daną instrukcję programu określoną liczbę razy lub do momentu osiągnięcia określonego skutku. Pętla iteracyjna while

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania wykład 4 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2017/2018 Pętle wykonujące się podaną liczbę razy Jeśli chcemy wykonać pewien fragment programu określoną liczbę razy, możemy użyć

Bardziej szczegółowo

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz

Bardziej szczegółowo

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je. Problem porządkowania zwanego również sortowaniem jest jednym z najważniejszych i najpopularniejszych zagadnień informatycznych. Dane: Liczba naturalna n i ciąg n liczb x 1, x 2,, x n. Wynik: Uporządkowanie

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania Wstęp do programowania Rekurencja, metoda dziel i zwyciężaj Paweł Daniluk Wydział Fizyki Jesień 2014 P. Daniluk(Wydział Fizyki) WP w. VIII Jesień 2014 1 / 27 Rekurencja Recursion See Recursion. P. Daniluk(Wydział

Bardziej szczegółowo

Wyszukiwanie binarne

Wyszukiwanie binarne Wyszukiwanie binarne Wyszukiwanie binarne to technika pozwalająca na przeszukanie jakiegoś posortowanego zbioru danych w czasie logarytmicznie zależnym od jego wielkości (co to dokładnie znaczy dowiecie

Bardziej szczegółowo

Warunek wielokrotnego wyboru switch... case

Warunek wielokrotnego wyboru switch... case Warunek wielokrotnego wyboru switch... case Działanie instrukcji switch jest zupełnie inne niż w przypadku instrukcji if o czym będziesz mógł się przekonać w niniejszym rozdziale. Różnice pomiędzy instrukcjami

Bardziej szczegółowo

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH ĆWICZENIE NR 9 WYRAŻENIA LOGICZNE, INSTRUKCJE WARUNKOWE I INSTRUKCJE ITERACYJNE W PROGRAMIE KOMPUTEROWYM MATLAB Dr inż. Sergiusz Sienkowski ĆWICZENIE NR

Bardziej szczegółowo

WHILE (wyrażenie) instrukcja;

WHILE (wyrażenie) instrukcja; INSTRUKCJE ITERACYJNE WHILE, DO WHILE, FOR Instrukcje iteracyjne pozwalają powtarzać daną instrukcję programu określoną liczbę razy lub do momentu osiągnięcia określonego skutku. Pętla iteracyjna while

Bardziej szczegółowo

Programowanie w VB Proste algorytmy sortowania

Programowanie w VB Proste algorytmy sortowania Programowanie w VB Proste algorytmy sortowania Sortowanie bąbelkowe Algorytm sortowania bąbelkowego polega na porównywaniu par elementów leżących obok siebie i, jeśli jest to potrzebne, zmienianiu ich

Bardziej szczegółowo

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest Pętle Pętla to pewien fragment kodu, który jest wykonywany wielokrotnie. Wyobraź sobie taką sytuację. Piszesz program do szyfrowania danych. Dane są szyfrowane kolejno bajt po bajcie. Załóżmy, że plik

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

I. Podstawy języka C powtórka

I. Podstawy języka C powtórka I. Podstawy języka C powtórka Zadanie 1. Utwórz zmienne a = 730 (typu int), b = 106 (typu long long), c = 123.45 (typu double) Wypisz następujące komunikaty: Dane sa liczby: a = 730, b = 106 i c = 123.45.

Bardziej szczegółowo

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6 PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6 TEMAT: Programowanie w języku C/C++: instrukcje iteracyjne for, while, do while Ogólna postać instrukcji for for (wyr1; wyr2; wyr3) Instrukcja for twory pętlę działającą

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Instrukcje sterujące

Instrukcje sterujące Podstawy programowania w C++ Bibliografia: Instrukcje sterujące Nauka programowania dla początkujących; A. Struzińska-Walczak / K. Walczak CPA: PROGRAMMING ESSENTIALS IN C++ https://www.netacad.com Opracował:

Bardziej szczegółowo

Podstawy programowania skrót z wykładów:

Podstawy programowania skrót z wykładów: Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace

Bardziej szczegółowo

Metody Metody, parametry, zwracanie wartości

Metody Metody, parametry, zwracanie wartości Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Metody Metody, parametry, zwracanie wartości Metody - co to jest i po co? Metoda to wydzielona część klasy, mająca

Bardziej szczegółowo

Paradygmaty programowania

Paradygmaty programowania Paradygmaty programowania Jacek Michałowski, Piotr Latanowicz 15 kwietnia 2014 Jacek Michałowski, Piotr Latanowicz () Paradygmaty programowania 15 kwietnia 2014 1 / 12 Zadanie 1 Zadanie 1 Rachunek predykatów

Bardziej szczegółowo

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek Nazwa implementacji: Nauka języka Python pętla for Autor: Piotr Fiorek Opis implementacji: Poznanie innego rodzaju pętli, jaką jest pętla for w języku Python. Składnia pętli for jest następująca: for

Bardziej szczegółowo

Podstawy Programowania Podstawowa składnia języka C++

Podstawy Programowania Podstawowa składnia języka C++ Podstawy Programowania Podstawowa składnia języka C++ Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 3 października 2013 r. Szablon programu w C++ Najprostszy program w C++ ma postać: #include #include

Bardziej szczegółowo

ALGORYTMY I STRUKTURY DANYCH

ALGORYTMY I STRUKTURY DANYCH KATEDRASYSTEMÓWOBLICZENIOWYCH ALGORYTMY I STRUKTURY DANYCH 1.Rekurencja Rekurencja inaczej rekursja (ang. recursion) to wywołanie z poziomu metody jej samej. Programowanie z wykorzytaniem rekurencji pozwala

Bardziej szczegółowo

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Zajęcia nr 2 Programowanie strukturalne dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Pętla while #include using namespace std; int main ()

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania wykład 5 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2016/2017 Zadanie o kotach z poprzedniego wykładu # include < iostream > using namespace std ; int main (){ int rozmiar_ rodzinki,

Bardziej szczegółowo

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis i cz. 2 Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 i cz. 2 2 i cz. 2 3 Funkcje i cz. 2 typ nazwa ( lista-parametrów ) { deklaracje instrukcje } i cz. 2 typ nazwa ( lista-parametrów ) { deklaracje

Bardziej szczegółowo

Programowanie Funkcyjne. Marcin Kubica Świder,

Programowanie Funkcyjne. Marcin Kubica Świder, Programowanie Funkcyjne Marcin Kubica Świder, 28-04-2015 Czym jest programowanie funkcyjne? Obliczalne pojęcia matematyczne. Definicje stałych i funkcji i relacji. Wszystkie definicje są konstruktywne,

Bardziej szczegółowo

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki INFORMATYKA Z MERMIDONEM Programowanie Moduł 5 / Notatki Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego. Realizator projektu: Opracowano w ramach projektu

Bardziej szczegółowo

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else. Nazwa implementacji: Nauka języka Python wyrażenia warunkowe Autor: Piotr Fiorek Opis implementacji: Poznanie wyrażeń warunkowych if elif - else. Nasz kalkulator umie już liczyć, ale potrafi przeprowadzać

Bardziej szczegółowo

Zadanie 1. Zmiana systemów. Zadanie 2. Szyfr Cezara. Zadanie 3. Czy liczba jest doskonała. Zadanie 4. Rozkład liczby na czynniki pierwsze Zadanie 5.

Zadanie 1. Zmiana systemów. Zadanie 2. Szyfr Cezara. Zadanie 3. Czy liczba jest doskonała. Zadanie 4. Rozkład liczby na czynniki pierwsze Zadanie 5. Zadanie 1. Zmiana systemów. Zadanie 2. Szyfr Cezara. Zadanie 3. Czy liczba jest doskonała. Zadanie 4. Rozkład liczby na czynniki pierwsze Zadanie 5. Schemat Hornera. Wyjaśnienie: Zadanie 1. Pozycyjne reprezentacje

Bardziej szczegółowo

Algorytmy sortujące i wyszukujące

Algorytmy sortujące i wyszukujące Algorytmy sortujące i wyszukujące Zadaniem algorytmów sortujących jest ułożenie elementów danego zbioru w ściśle określonej kolejności. Najczęściej wykorzystywany jest porządek numeryczny lub leksykograficzny.

Bardziej szczegółowo

C++ Przeładowanie operatorów i wzorce w klasach

C++ Przeładowanie operatorów i wzorce w klasach C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009 Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje

Bardziej szczegółowo

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana.

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana. 8. Wektory Przykłady 8.1. Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana. Uwaga! Kod poniżej. To zadanie można rozwiązać przy użyciu wiedzy

Bardziej szczegółowo

ECDL Podstawy programowania Sylabus - wersja 1.0

ECDL Podstawy programowania Sylabus - wersja 1.0 ECDL Podstawy programowania Sylabus - wersja 1.0 Przeznaczenie Sylabusa Dokument ten zawiera szczegółowy Sylabus dla modułu Podstawy programowania. Sylabus opisuje, poprzez efekty uczenia się, zakres wiedzy

Bardziej szczegółowo

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno Instrukcja laboratoryjna 6 Podstawy programowania 2 Temat: Funkcje i procedury rekurencyjne Przygotował: mgr inż. Tomasz Michno Wstęp teoretyczny Rekurencja (inaczej nazywana rekursją, ang. recursion)

Bardziej szczegółowo

LibreOffice Calc VBA

LibreOffice Calc VBA LibreOffice Calc VBA LibreOffice Calc umożliwia tworzenie własnych funkcji i procedur przy użyciu składni języka VBA. Dostęp do edytora makr: Narzędzia->Makra->Zarządaj makrami->libreoffice Calc Aby rozpocząć

Bardziej szczegółowo

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD Podstawy programowania Wykład: 13 Rekurencja 1 dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD Podstawy programowania Rekurencja - pojęcie 2 Rekurencja - pojęcie Rekurencja (rekursja) wywołanie

Bardziej szczegółowo

Programowanie w Turbo Pascal

Programowanie w Turbo Pascal Skróty: ALT + F9 Kompilacja CTRL + F9 Uruchomienie Struktura programu: Programowanie w Turbo Pascal Program nazwa; - nagłówek programu - blok deklaracji (tu znajduje się VAR lub CONST) - blok instrukcji

Bardziej szczegółowo

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki Informatyka I Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli Dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Operacje relacji (porównania) A

Bardziej szczegółowo

do instrukcja while (wyrażenie);

do instrukcja while (wyrażenie); Instrukcje pętli -ćwiczenia Instrukcja while Pętla while (póki) powoduje powtarzanie zawartej w niej sekwencji instrukcji tak długo, jak długo zaczynające pętlę wyrażenie pozostaje prawdziwe. while ( wyrażenie

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania wykład 3 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2017/2018 Instrukcja wielokrotnego wyboru Instrukcja wielokrotnego wyboru switch umożliwia podejmowanie decyzji na podstawie wartości

Bardziej szczegółowo

ze względu na jego zaokrąglony kształt musimy go umieścić w innych bloczkach np. ze zmienną: lub jeśli chcemy sprawdzić jaki właśnie znak odczytujemy:

ze względu na jego zaokrąglony kształt musimy go umieścić w innych bloczkach np. ze zmienną: lub jeśli chcemy sprawdzić jaki właśnie znak odczytujemy: Ostatnio kontynuowaliśmy temat "rozmawiania" z Arduino (komunikacji z wykorzystaniem portu szeregowego), która jest nam o tyle potrzebna, że właśnie w ten sposób później będziemy rozmawiać z płytką wykorzystując

Bardziej szczegółowo

Podstawy Programowania C++

Podstawy Programowania C++ Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:

Bardziej szczegółowo

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10. ZAMIANA LICZB MIĘDZY SYSTEMAMI DWÓJKOWYM I DZIESIĘTNYM Aby zamienić liczbę z systemu dwójkowego (binarnego) na dziesiętny (decymalny) należy najpierw przypomnieć sobie jak są tworzone liczby w ww systemach

Bardziej szczegółowo

Informatyka wprowadzenie do algorytmów (II) dr hab. inż. Mikołaj Morzy

Informatyka wprowadzenie do algorytmów (II) dr hab. inż. Mikołaj Morzy Informatyka wprowadze do algorytmów (II) dr hab. inż. Mikołaj Morzy plan wykładu cechy algorytmów sposoby zapisu algorytmów klasyfikacja algorytmów przykłady algorytmów sumowa przeszukiwa ciągu liczb sortowa

Bardziej szczegółowo

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Bash - wprowadzenie. Bash - wprowadzenie 1/39 Bash - wprowadzenie Bash - wprowadzenie 1/39 Bash - wprowadzenie 2/39 Czym jest bash? Rysunek : Zadanie powłoki to ukrycie wywołań systemowych Bash - wprowadzenie 3/39 Czym jest bash? Przykład polecenia:

Bardziej szczegółowo

Złożoność obliczeniowa zadania, zestaw 2

Złożoność obliczeniowa zadania, zestaw 2 Złożoność obliczeniowa zadania, zestaw 2 Określanie złożoności obliczeniowej algorytmów, obliczanie pesymistycznej i oczekiwanej złożoności obliczeniowej 1. Dana jest tablica jednowymiarowa A o rozmiarze

Bardziej szczegółowo

Programowanie dynamiczne

Programowanie dynamiczne Programowanie dynamiczne Ciąg Fibonacciego fib(0)=1 fib(1)=1 fib(n)=fib(n-1)+fib(n-2), gdzie n 2 Elementy tego ciągu stanowią liczby naturalne tworzące ciąg o takiej własności, że kolejny wyraz (z wyjątkiem

Bardziej szczegółowo

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami Przykład 1. Napisz program, który dla podanej liczby n wypisze jej rozkład na czynniki pierwsze. Oblicz asymptotyczną złożoność

Bardziej szczegółowo

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny Wstęp do Programowania potok funkcyjny Marcin Kubica 2010/2011 Outline Procedury wyższych rzędów 1 Procedury wyższych rzędów jako abstrakcje konstrukcji programistycznych Intuicje Procedury wyższych rzędów

Bardziej szczegółowo

Języki programowania Haskell

Języki programowania Haskell Języki programowania Haskell zadanie projektowe nr. 4 2014/15 K. Turowski, T. Goluch 1. Kompilacja, uruchamianie i Hello world Kompilacja i uruchamianie: ghc --make hello.hs./hello Interaktywny interpreter:

Bardziej szczegółowo

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady Pętle i tablice. Spotkanie 3 Dr inż. Dariusz JĘDRZEJCZYK Pętle: for, while, do while Tablice Przykłady 11/26/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Pętla w największym uproszczeniu służy

Bardziej szczegółowo

do MATLABa programowanie WYKŁAD Piotr Ciskowski

do MATLABa programowanie WYKŁAD Piotr Ciskowski Wprowadzenie do MATLABa programowanie WYKŁAD Piotr Ciskowski instrukcje sterujące instrukcja warunkowa: if instrukcja wyboru: switch instrukcje iteracyjne: for, while instrukcje przerwania: continue, break,

Bardziej szczegółowo

WEJŚCIE/WYJŚCIE HASKELL ŁUKASZ PAWLAK DARIUSZ KRYSIAK

WEJŚCIE/WYJŚCIE HASKELL ŁUKASZ PAWLAK DARIUSZ KRYSIAK WEJŚCIE/WYJŚCIE HASKELL ŁUKASZ PAWLAK DARIUSZ KRYSIAK W Haskellu funkcje nie mogą zmieniać stanów (w tym np. zmieniać wartości zmiennej). Funkcja wywołana z pewnymi ustalonymi argumentami musi zwracać

Bardziej szczegółowo

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno Instrukcja laboratoryjna 5 Podstawy programowania 2 Temat: Drzewa binarne Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny Drzewa są jedną z częściej wykorzystywanych struktur danych. Reprezentują

Bardziej szczegółowo

Strategia "dziel i zwyciężaj"

Strategia dziel i zwyciężaj Strategia "dziel i zwyciężaj" W tej metodzie problem dzielony jest na kilka mniejszych podproblemów podobnych do początkowego problemu. Problemy te rozwiązywane są rekurencyjnie, a następnie rozwiązania

Bardziej szczegółowo

Języki i Paradygmaty Programowania

Języki i Paradygmaty Programowania Języki i Paradygmaty Programowania Odkrywamy Haskell Marcin Benke 24 lutego 2014 Odkrywamy Haskell Haskell zasadniczo kompilowany, ale też interpreter: ghci $ ghci GHCi, version 7.6.2: http://www.haskell.org/ghc/

Bardziej szczegółowo

Metody numeryczne Laboratorium 2

Metody numeryczne Laboratorium 2 Metody numeryczne Laboratorium 2 1. Tworzenie i uruchamianie skryptów Środowisko MATLAB/GNU Octave daje nam możliwość tworzenia skryptów czyli zapisywania grup poleceń czy funkcji w osobnym pliku i uruchamiania

Bardziej szczegółowo

Technologie Informacyjne - Linux 3

Technologie Informacyjne - Linux 3 Technologie Informacyjne - 3 Instytut Matematyki Uniwersytet Gdański Tryby plików i uprawnienia Każdy z plików uniksowych posiada zbiór uprawnień określajacych, czy możemy dany plik odczytać (r), zapisać

Bardziej szczegółowo

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA Python wprowadzenie Warszawa, 24 marca 2017 Python to język: nowoczesny łatwy w użyciu silny można pisać aplikacje Obiektowy klejący może być zintegrowany z innymi językami np. C, C++, Java działający

Bardziej szczegółowo

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek]. ABAP/4 Instrukcja IF Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek]. [ELSEIF warunek. ] [ELSE. ] ENDIF. gdzie: warunek dowolne wyrażenie logiczne o wartości

Bardziej szczegółowo

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać MatLab część III 1 Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać komentarze poprzedzone znakiem % Skrypty

Bardziej szczegółowo

Ćwiczenie 1. Wprowadzenie do programu Octave

Ćwiczenie 1. Wprowadzenie do programu Octave Politechnika Wrocławska Wydział Elektroniki Mikrosystemów i Fotoniki Przetwarzanie sygnałów laboratorium ETD5067L Ćwiczenie 1. Wprowadzenie do programu Octave Mimo że program Octave został stworzony do

Bardziej szczegółowo

Luty 2001 Algorytmy (7) 2000/2001 s-rg@siwy.il.pw.edu.pl

Luty 2001 Algorytmy (7) 2000/2001 s-rg@siwy.il.pw.edu.pl System dziesiętny 7 * 10 4 + 3 * 10 3 + 0 * 10 2 + 5 *10 1 + 1 * 10 0 = 73051 Liczba 10 w tym zapisie nazywa się podstawą systemu liczenia. Jeśli liczba 73051 byłaby zapisana w systemie ósemkowym, co powinniśmy

Bardziej szczegółowo

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r. M. Trzebiński C++ 1/14 Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IVedycja,2016r. IFJ PAN Przygotowanie środowiska pracy Niniejsza

Bardziej szczegółowo

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1 Pętle Pętla jest konstrukcją sterującą stosowaną w celu wielokrotnego wykonania tego samego zestawu instrukcji jednokrotne

Bardziej szczegółowo

Lekcja : Tablice + pętle

Lekcja : Tablice + pętle Lekcja : Tablice + pętle Wprowadzenie Oczywiście wiesz już jak dużo można osiągnąć za pomocą tablic oraz jak dużo można osiągnąć za pomocą pętli, jednak tak naprawdę prawdziwe możliwości daje połączenie

Bardziej szczegółowo

Zaawansowane algorytmy i struktury danych

Zaawansowane algorytmy i struktury danych Zaawansowane algorytmy i struktury danych u dr Barbary Marszał-Paszek Opracowanie pytań teoretycznych z egzaminów. Strona 1 z 12 Pytania teoretyczne z egzaminu pisemnego z 25 czerwca 2014 (studia dzienne)

Bardziej szczegółowo

Funkcje. Wprowadzenie. Mirosław Ochodek

Funkcje. Wprowadzenie. Mirosław Ochodek Funkcje Wprowadzenie Mirosław Ochodek Miroslaw.Ochodek@pwsz.pila.pl Miroslaw.Ochodek@cs.put.poznan.pl Funkcje (i procedury) Problem Zbyt długi ciąg instrukcji sprawia, że kod jest nieczytelny Często w

Bardziej szczegółowo

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA) Podstawy programowania w języku Visual Basic dla Aplikacji (VBA) Instrukcje Język Basic został stworzony w 1964 roku przez J.G. Kemeny ego i T.F. Kurtza z Uniwersytetu w Darthmouth (USA). Nazwa Basic jest

Bardziej szczegółowo

DYDAKTYKA ZAGADNIENIA CYFROWE ZAGADNIENIA CYFROWE

DYDAKTYKA ZAGADNIENIA CYFROWE ZAGADNIENIA CYFROWE ZAGADNIENIA CYFROWE ZAGADNIENIA CYFROWE @KEMOR SPIS TREŚCI. SYSTEMY LICZBOWE...3.. SYSTEM DZIESIĘTNY...3.2. SYSTEM DWÓJKOWY...3.3. SYSTEM SZESNASTKOWY...4 2. PODSTAWOWE OPERACJE NA LICZBACH BINARNYCH...5

Bardziej szczegółowo

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja

Bardziej szczegółowo

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje Podstawy informatyki Informatyka stosowana - studia niestacjonarne - Zajęcia nr 4 Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w

Bardziej szczegółowo

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7 Spis treści 1 Funkcje 1.1 Zadanie 1 1.2 Zadanie 2 1.3 Zadanie 3 1.4 Zadanie 4 1.5 Zadanie 5 1.6 Zadanie 6 1.7 Zadanie 7 Funkcje Przy programowaniu często zdarza się, że pewne czynności chcemy wykonywać

Bardziej szczegółowo

WYRAŻENIA ALGEBRAICZNE

WYRAŻENIA ALGEBRAICZNE WYRAŻENIA ALGEBRAICZNE Wyrażeniem algebraicznym nazywamy wyrażenie zbudowane z liczb, liter, nawiasów oraz znaków działań, na przykład: Symbole literowe występujące w wyrażeniu algebraicznym nazywamy zmiennymi.

Bardziej szczegółowo