Programowanie funkcyjne/Struktury danych/Ćwiczenia
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Praca domowa
- Napisz procedurę dubluj, która dubluje elementy listy. Na przykład, dubluj [1;2;3] = [1;1;2;2;3;3].
- Zaimplementuj arytmetykę liczb wymiernych, reprezentując liczby wymierne jako rekordy złożone z licznika i mianownika. Implementacja może być uproszczona, np.\ bez skracania ułamków i bez normalizacji znaków.
- Zadeklaruj wariantowy typ danych reprezentujący abstrakcyjną składnię wyrażeń arytmetycznych. Napisz procedurę obliczającą wartość wyrażenia.
Ćwiczenia
Ćwiczenie programistyczne na listy:
- Zaimplementuj procedurę zwracającą -ty element listy.
- Napisz procedurę tworzącą listę pierwszych liczb naturalnych.
- Zaimplementuj procedurę rev odwrócającą listę. (Zwróć uwagę, że rozwiązując to zadanie można korzystać z :: lub @, co daje liniową lub kwadratową złożoność czasową.)
- Zaimplementuj procedurę append sklejającą listy.
- Ciąg różnicowy ciągu to ciąg postaci . Napisz procedurę obliczającą ciąg różnicowy zadanej listy liczb całkowitych.
- Napisz procedurę obliczającą listę kolejnych ciągów różnicowych zadanej listy liczb całkowitych.
- Napisz procedurę, której wynikiem jest para: minimum i maksimum elementów z listy. Procedura ta powinna wykonywać co najwyżej porównań.
- Napisz procedurę flatten rozwijającą listę list do listy elementów. Na przykład, flatten [[1; 2]; []; [3; 4; 5]] = [1; 2; 3; 4; 5].
- Napisz procedurę last, której wynikiem jest ostatni element listy.
- Napisz procedury head i tail, które dla zadanej listy i liczby całkowitej zwracają pierwsze/ostatnie elementów listy . Jeśli lista ma mniej elementów niż , to wynikiem powinna być cała lista . (Nazwy pochodzą od programów head i tail w Uniksie.) Co jest wynikiem tail (head l n) 1?
- Napisz procedurę posumuj, która dla danej niemalejącej listy dodatnich liczb całkowitych oblicza listę , gdzie . (Pamiętaj o tym, że jeśli , .)
- Zaimplementuj sortowanie: przez scalanie lub quick-sort.
- Zaimplementuj pakiet arytmetyczny nieograniczonych liczb całkowitych.
- Napisz program wybierający większość z listy większościowej; uzasadnij jego poprawność. Uwaga: to zadanie można rozwiązać probabilistycznie: metodą Las Vegas: wylosuj element i sprawdź czy to większość; policz oczekiwaną złożoność,
- 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 Twój program.
- Napisz funkcję trójki:int list (int * int * int) list, która dla zadanej listy dodatnich liczb całkowitych, uporządkowanej rosnąco, stworzy listę takich trójek liczb z danej listy, że:
- ,
- liczby , i spełniają nierówność trójkąta, czyli .
- Zdefiniuj taką funkcję przedziały:int list int*int, że przedzialy, gdzie jest to taka para liczb , dla której suma jest największa. Oblicz i podaj złożoność Twojego rozwiązania (jako funkcję ).
Ćwiczenia na inne struktury danych:
- Zdefiniuj typ reprezentujący drzewa o wierzchołkach dowolnego (skończonego stopnia).
- Zdefiniuj trochę procedur operujących na takich drzewach.
- Zdefiniuj typ reprezentujący dni tygodnia, miesiące i datę.
- Zdefiniuj procedurę obliczającą na podstawie daty dzień tygodnia. Możesz założyć, że dana jest procedura sylwester, która na podstawie roku określa jakiego dnia tygodnia był Sylwester.
Ćwiczenia na inne struktury danych:
- Napisz całe mnóstwo procedur operujących na drzewach. Mogą to być znane Ci operacje dotyczące drzew, lub odpowiedniki operacji na listach.
- Napisz procedurę, która dla dowolnego drzewa binarnego poprawia je tak, że spełnia ono słabszą wersję warunku BST: dla dowolnego węzła, lewy syn nie jest większy, a prawy nie jest mniejszy, niż węzeł.
- Napisz procedurę, która przekształca dane drzewo binarne w wyważone drzewo binarne, zachowując kolejność elementów w porządku infiksowym.
- Rozszerzyć implementację kolejek o wkładanie i wyjmowanie elementów z obydwu stron.
- Dany jest typ danych reprezentujący (mało efektywnie) liczby naturalne: type nat = ZERO | SUCC of nat;;. Zaimplementuj operacje arytmetyczne na takich liczbach.
- Zaimplementuj takie operacje na zbiorach, jak suma, przecięcie, różnica.