Programowanie funkcyjne/Struktury danych/Ćwiczenia: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
|||
Linia 1: | Linia 1: | ||
==Praca domowa== | |||
* Napisz procedurę <tt>dubluj</tt>, która dubluje elementy listy. Na przykład, <tt>dubluj [1;2;3] = [1;1;2;2;3;3]</tt>. | |||
==Ćwiczenia== | ==Ćwiczenia== | ||
Linia 15: | Linia 18: | ||
* Zdefiniuj procedurę obliczającą na podstawie daty dzień tygodnia. Możesz założyć, że dana jest procedura <tt>sylwester</tt>, która na podstawie roku określa jakiego dnia tygodnia był Sylwester. | * Zdefiniuj procedurę obliczającą na podstawie daty dzień tygodnia. Możesz założyć, że dana jest procedura <tt>sylwester</tt>, która na podstawie roku określa jakiego dnia tygodnia był Sylwester. | ||
Proste ćwiczenia na listy. Można je wykonywać w dwóch wariantach: korzystając ze wzorców, lub z procedur <tt>hd</tt>, <tt>tl</tt> i (zdefiniowanej samemu) <tt>null</tt>. | Proste ćwiczenia na listy. Można je wykonywać w dwóch wariantach: korzystając ze wzorców, lub z procedur <tt>hd</tt>, <tt>tl</tt> i (zdefiniowanej samemu) <tt>null</tt>. | ||
* Rozwinięcie listy list do listy (<tt>flatten</tt>). | * Rozwinięcie listy list do listy (<tt>flatten</tt>). | ||
* Napisz procedurę <tt>last</tt>, której wynikiem jest ostatni element listy. | * Napisz procedurę <tt>last</tt>, której wynikiem jest ostatni element listy. | ||
* Napisz procedury <tt>head</tt> i <tt>tail</tt>, które dla zadanej listy <math>l</math> i liczby całkowitej <math>n</math> zwracają pierwsze/ostatnie <math>n</math> elementów listy <math>l</math>. Jeśli lista <math>l</math> ma mniej elementów niż <math>n</math>, to wynikiem powinna być cała lista <math>l</math>. (Nazwy pochodzą od programów <tt>head</tt> i <tt>tail</tt> w Uniksie.) Co jest wynikiem <tt>tail (head l n) 1</tt>? | * Napisz procedury <tt>head</tt> i <tt>tail</tt>, które dla zadanej listy <math>l</math> i liczby całkowitej <math>n</math> zwracają pierwsze/ostatnie <math>n</math> elementów listy <math>l</math>. Jeśli lista <math>l</math> ma mniej elementów niż <math>n</math>, to wynikiem powinna być cała lista <math>l</math>. (Nazwy pochodzą od programów <tt>head</tt> i <tt>tail</tt> w Uniksie.) Co jest wynikiem <tt>tail (head l n) 1</tt>? |
Wersja z 11:55, 24 sie 2006
Praca domowa
- Napisz procedurę dubluj, która dubluje elementy listy. Na przykład, dubluj [1;2;3] = [1;1;2;2;3;3].
Ć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.
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).
- 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:
- 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.