Programowanie funkcyjne/Zadania egzaminacyjne
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Propozycje zadań egzaminacyjnych:
- Napisz procedurę posumuj, która dla danej niemalejącej listy dodatnich liczb całkowitych oblicza listę , gdzie . (Pamiętaj o tym, że jeśli , .)
- Tomek ma zabawkę, z której wystają drewniane słupki różnej wysokości. Jednym uderzeniem młotka może wbić lub wysunąć wybrany słupek o 1. Napisz procedurę słupki, która dla danej listy początkowych wysokości słupków obliczy minimalną liczbę uderzeń młotka potrzebnych do wyrównania wysokości słupków.
- Napisz funkcję max_diff : int list int, która dla niepustej listy znajdzie maksymalną różnicę dla . Jaką złożoność ma Twoja procedura?
- Napisz procedurę przedziały:int list -> int*int, która dla danej listy oblicza taką parę liczb , , dla której suma jest największa. Oblicz i podaj złożoność Twojego rozwiązania.
- Napisz procedurę podział: int list -> int list list, która dla danej listy liczb całkowitych podzieli ją na listę list , przy czym:
- Parser nie mógł rozpoznać (błąd składni): {\displaystyle l = l_1 @ \dots @ l_k} ,
- każda z list jest ściśle rosnąca,
- jest najmniejsze możliwe.
- Przykład:
podział [1;3;0;-2;-2;4;9] = [[1; 3]; [0]; [-2]; [-2;4;9]]
- Napisz procedurę podziel: int list -> int list list, która dla danej listy zawierającej permutację zbioru znajdzie jej podział na jak najliczniejszą listę list postaci:
- taką że:
- Przyjmujemy, że wynikiem dla listy pustej jest lista pusta.
- Przykład:
podziel [2; 3; 1; 6; 5; 4; 7; 9; 10; 11; 8] = [[2; 3; 1]; [6; 5; 4]; [7]; [9; 10; 11; 8]]
- Rozwiązując to zadanie powinieneś skorzystać z rekurencji, ale wolno Ci korzystać wyłącznie z rekurencji ogonowej.
- Napisz procedurę buduj_permutacje: 'a list list -> 'a -> 'a, która przyjmuje permutację w postaci rozkładu na cykle i zwraca ją w postaci procedury. Lista składowa postaci , gdzie dla , reprezentuje cykl, czyli permutację przeprowadzającą na dla . Możesz założyć, że listy składowe są niepuste.
- Lista list , gdzie listy dla reprezentują cykle, reprezentuje permutację złożoną z tych cykli. Możesz założyć, że wszystkie cykle są rozłączne.
- Przyjmujemy, że dla wartości nie występujących na żadnej z list wynikiem buduj_permutacje jest . W szczególności, przyjmujemy, że pusta lista reprezentuje permutację identycznościową.
- Przykład:
let p = buduj_permutacje [[2; 1]; [8; 3; 4]; [5; 7; 6; 10]; [11]];; map p [1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12];; -: int list = [2; 1; 4; 8; 7; 10; 6; 3; 9; 5; 11; 12]
- Dana jest lista liczb zmiennopozycyjnych . Jej uśrednienie, to lista postaci: . Uśrednieniem listy jednoelementowej oraz pustej jest lista pusta.
- Napisz procedurę usrednienie, która dla danej listy obliczy jej uśrednienie. Rozwiązując to zadanie nie możesz tworzyć procedur rekurencyjnych. Zamiast tego powinieneś skorzystać ze standardowych procedur wyższych rzędów przetwarzających listy.
- Rozważmy następującą metodę kompresji ciągów liczb całkowitych: Jeżeli w oryginalnym ciągu ta sama liczba powtarza się kilka razy z rzędu, to jej kolejne wystąpienia reprezentujemy za pomocą jednej tylko liczby. Konkretnie, $i$ powtórzeń liczby $k$ reprezentujemy w ciągu skompresowanym jako .
- Napisz procedurę kompresuj: int list -> int list kompresującą zadaną listę. Lista wynikowa powinna być oczywiście jak najkrótsza.
- Rozwiązując to zadanie nie wolno Ci tworzyć żadnych własnych procedur rekurencyjnych. Powinieneś natomiast użyć procedur wyższych rzędów przetwarzających listy, znanych z wykładów.
- Przykład:
kompresuj [1; 2; 2; 5; 11; 11; 2] = [1; 6; 9; 42; 3]
- Napisz procedurę codrugi: 'a stream -> 'a stream, która przekształca strumień postaci w strumień postaci . Powinna ona działać zarówno dla strumieni skończonych, jak i nieskończonych.
- Zdefiniuj w sposób uwikłany strumień złożony z tych dodatnich liczb całkowitych, które w rozkładzie na czynniki pierwsze mają tylko liczby 2 i 3, oraz rozkładają się na nieparzystą liczbę czynników pierwszych.