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 (a1an) oblicza listę (b1bn), gdzie bi=k=ainak. (Pamiętaj o tym, że jeśli m>n, k=mnak=0.)
  • 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 [x1;;xn] znajdzie maksymalną różnicę xjxi dla 1ijn. Jaką złożoność ma Twoja procedura?
  • Napisz procedurę przedziały:int list -> int*int, która dla danej listy [a1,,an] oblicza taką parę liczb (k,l), 1kln, dla której suma ak++al jest największa. Oblicz i podaj złożoność Twojego rozwiązania.
  • Napisz procedurę podziel: int list -> int list list, która dla danej listy [a1;a2;;an] zawierającej permutację zbioru {1,2,,n} znajdzie jej podział na jak najliczniejszą listę list postaci:
[[a1;a2;;ak1];[ak1+1;ak1+2;;ak2];;[akm1+1;akm1+2;;akm]]
taką że:
{a1,a2,,ak1}={1,2,,k1}(równość zbiorów),{ak1+1,ak1+2,,ak2}={k1+1,k1+2,,k2},{akm1+1,akm1+2,,akm}={km1+1,km1+2,,km}
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.
  • Dana jest lista liczb zmiennopozycyjnych [x1;x2;;xn]. Jej uśrednienie, to lista postaci: [x1+.x22.0;;xn1+.xn2.0]. 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 2i1(2k1).
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].
  • 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.