// Lista I // Funkfe i rekurencja, przetwarzanie list // Zmienne tworzymy przy za pomoca konstrukcji let [nazwa] = [wyrazenie] // na przyklad let x = 3 let y = x * x // Zaznacz oba wiersze i wcisnij ctrl + enter. // Przeniesie to je do "trybu interaktywnego", gdzie natychmiast // zostana obliczone jej wartosci. Nie musimy kompilowac i uruchamiac // W samym trybie interaktywnym mozna tez pisac dowolne wyrazenia, definiowac funkcje // Zwroc uwage, ze nie musisz podawac typu o ile jest on latwy // do wywnioskowania // Jesli z jakichs wzgleedow zaznaczyc typ, mozemy to zrobic: let z : int = x + y let s : string = "Ala ma konta." // funkcje definiujemy przy uzyciu tego samego slowa kluczowego // argumenty mozemy zawrzec w nawiasach lub kolejno po spacjach // W przeciwieństwie do C#, nie uzywamy tutaj sl‚owa kluczowego return // Z funkcji zwracana jest pierwsza wartosc, ktora nie jest zwiazana // przy pomocy let .. = .. let mult(x, y) = x * y let sum x y = x + y //Jesli chcemy obliczyc wartosc funkcji, wystarczy przekazac //jej argumenty przy uzyciu tej samej konwencji, ktorej uzylismy //definiujac funkcje let res = mult(2, 7) let res2 = sum 5 223 // ZADANIE: // Wpisz w trybie interaktywnym nastepujaca napisy. // sum(5, 223) // oraz // mult 2 7 // Sprobuj zrozumiec komunikat o bledzie, ktory zostanie wyswietlony // W F# nie uzywamy wasow do zaznaczenie ciala funkcji lub // instrukcji warunkowych // Zasieg funkcji jest okreslany poprzez wciecia. let abs x = if x < 0 then -x else x let sgn x = if x < 0 then -1 else if x = 0 // pojedyncza rownosc! then 0 else 1 // przetestujmy funkcje sgn let sgnTest1 = sgn 5 = -1 let sgnTest2 = sgn 0 = 0 let sgnTest3 = sgn -3 = 1 // ZADANIE: // napisz funkcje, ktora podniesie argument do kwadratu, // a nastepnie wywołaj ja na swoim numerze indeksu // Z pewnych wzgledow w F# musimy wprost zaznaczyc sowem kluczowym rec // ze funkcja jest rekurencyjna (wywoluje sama siebie) let rec factorial n = if n < 2 then 1 else n * factorial (n-1) let testFac = factorial 5 = 120 // ZADANIE: // napisz funkcje, ktora dla argumentu n obliczy n-ta // liczbe Fibonacciego // Sprawdz na kilku przykladach, ze dziala poprawnie // Podstawowa kolekcja uzywana w tym swiecie jest lista (jednokierunkowa) // Elementy listy musza byc tego samego typu, oddzielamy je srednikami // Lista pusta let lst = [] // Lista zlozona z trzech elementow: liczb 1, 2 oraz 3 let lst1 = [1; 2; 3] // Lista zlozona z kilku napisow let lst2 = [ "Bolek"; "i"; "Lolek" ] // Oczywiscie elementy moga sie powtarzac let lst3 = [1; 2; 3; 1; 5] // Lista zlozona z liczb od 2 do 17 let lst4 = [2..17] // Co to za lista? let lst5 = [ 3..2..14] //Jesli mamy liste, mozemy utworzyc nowa liste doklejajac element na //jej przedzie let lst6 = 176 :: lst4 let lst7 = 774 :: 22 :: lst5 // Co jest wartoscia tego wyrazenia? let testLst = [1; 2] = 1 :: 2 :: [] //Listy ze wzgledu na swoja budowe (doklejamy elementy tylko do przodu) //przetwarzamy rekurencyjnie let rec length (lst: int list) = match lst with // sprawdz do czego dopasowuje sie lista | [] -> 0 // jesli lista jest pusta, zwroc 0 | h::t -> // jesli lista sk‚lada sie z elementu h doklejonego do let tLen = length t // oblicz dlugosc listy t 1 + tLen // dlugosc listy to 1 + dlugosc jej ogona let testLength1 = let res = length [1;2;3] res = 3 // ZADANIE: // napisz funkcje, ktora policzy sume wszystkich elementow listy bedacej jej argumentem // Przetestuj ja rzetelnie! let rec listSum lst = failwith "tutaj wpisz rozwiazanie" // ZADANIE: // Napisz funkcje listMin, ktora znajdzie minimalny element listy let rec listMin lst = failwith "tutaj wpisz rozwiazanie" //let testMin = // listMin [2;5;3;-12;7;43] = -12 //let testMin1 = // listMin [100000..-1..7] = 7 //let testMin2 = // listMin [93..100000] = 93 // ZADANIE: // Napisz funkcje, ktora usunie z listy _pierwsze_ wystapienie danego elementu let rec delete lst el = failwith "Tutaj wpisz rozwiazanie" // ZADANIE: // Wykorzystujac funkcje listMin i delete, zaprogramuj // funkcje realizujaca algorytm sortownaia przez wybor let rec selSort lst = failwith "tutaj wpisz rozwiazanie" // ZADANIE: // Napisz funkcje insert, ktora przyjmie dwa argumenty: // liczbe oraz posortowana liste liczb // (to zakladamy o liscie, ale nie sprawdzamy; bedziemy wywolywac te funkcje tylko dla posortowanych list) // a nastepnie wstawi liczbe do listy tak, by ta nadal pozostala posortowana // let testInsert = insert 4 [] = [4] // let testInsert2 = insert 5 [0; 2; 7; 8] = [0; 2; 5; 7; 8] // let testInsert3 = insert -3 [0; 2; 7; 8] = [-3; 0; 2; 7; 8] // let testInsert4 = insert 9 [0; 2; 7; 8] = [0; 2; 7; 8; 9] // ZADANIE: // Wykorzystaj powyzsza funkcje do zaimplementowania algorytmu sortowania przez wstawianie // let testSort = sort [5; 3; 7; 2] = [2; 3; 5; 7]