Programowanie funkcyjne/Struktury danych/Ćwiczenia: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Linia 29: | Linia 29: | ||
** <math>a < b < c</math>, | ** <math>a < b < c</math>, | ||
** liczby <math>a</math>, <math>b</math> i <math>c</math> spełniają nierówność trójkąta, czyli <math>c < a + b</math>. | ** liczby <math>a</math>, <math>b</math> i <math>c</math> spełniają nierówność trójkąta, czyli <math>c < a + b</math>. | ||
* Zdefiniuj taką funkcję <tt>przedziały:int list <math>\to</math> int*int</tt>, że <math>\texttt{\mbox{ | * Zdefiniuj taką funkcję <tt>przedziały:int list <math>\to</math> int*int</tt>, że <math>\texttt{\mbox{przedzialy}}\ [a_1, \dots, a_n] = (k,l)</math>, gdzie jest to taka para liczb <math>1 \le k \le l \le n</math>, dla której suma <math>a_k + \cdots + a_l</math> jest największa. Oblicz i podaj złożoność Twojego rozwiązania (jako funkcję <math>n</math>). | ||
Ćwiczenia na inne struktury danych: | Ćwiczenia na inne struktury danych: |
Wersja z 11:35, 18 lip 2006
Ćwiczenia
Ćwiczenie programistyczne na listy:
- -ty element listy.
- Lista pierwszych liczb naturalnych.
- Odwrócenie listy rev. Wersje o liniowej (z ::) i kwadratowej (z @) złożoności czasowej. Porównać je.
- Sklejanie list append. Obliczenie ciągu różnicowego zadanej listy liczb całkowitych.
- Obliczenie listy 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ć jak najmniej porównań (ale bez przeginania).
Ć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.
Laboratorium
Proste ćwiczenia na listy. Można je wykonywać w dwóch wariantach: korzystając ze wzorców, lub z procedur hd, tl i (zdefiniowanej samemu) null.
- Rozwinięcie listy list do listy (flatten).
- Zdublować elementy listy.
- 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 , 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:
- 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.
- Zaimplementować 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 (jeśli czasu mało).
- 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.
- Zadeklaruj typ danych reprezentujący abstrakcyjną składnię wyrażeń arytmetycznych. Napisz procedurę obliczającą wartość wyrażenia.