Programowanie funkcyjne/Struktury danych/Ćwiczenia: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 5: | Linia 5: | ||
== Ćwiczenia == | == Ćwiczenia == | ||
Ćwiczenie programistyczne na listy: | |||
* Zaimplementuj procedurę <tt>rev</tt> odwracającą listę. (Zwróć uwagę, że rozwiązując to zadanie można korzystać z <tt>::</tt> lub <tt>@</tt>, co daje liniową lub kwadratową złożoność czasową.) | |||
* Napisz procedurę <tt>flatten</tt> rozwijającą listę list do listy elementów. Na przykład, <tt>flatten [[1; 2]; []; [3; 4; 5]] = [1; 2; 3; 4; 5]</tt>. | |||
Ć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, np. procedury wyznaczające listy elementów w porządku prefiksowym i postfiksowym. | |||
== Laboratorium == | |||
Ćwiczenie programistyczne na listy: | Ćwiczenie programistyczne na listy: | ||
* Zaimplementuj procedurę zwracającą <math>n</math>-ty element listy. | * Zaimplementuj procedurę zwracającą <math>n</math>-ty element listy. | ||
* Napisz procedurę tworzącą listę <math>n</math> pierwszych liczb naturalnych. | * Napisz procedurę tworzącą listę <math>n</math> pierwszych liczb naturalnych. | ||
* Zaimplementuj procedurę <tt>append</tt> sklejającą listy. | * Zaimplementuj procedurę <tt>append</tt> sklejającą listy. | ||
* Ciąg różnicowy ciągu <math>(x_1, \dots, x_n)</math> to ciąg postaci <math>(x_2-x_1,\dots,x_n-x_{n-1})</math>. Napisz procedurę obliczającą ciąg różnicowy żądanej listy liczb całkowitych. | * Ciąg różnicowy ciągu <math>(x_1, \dots, x_n)</math> to ciąg postaci <math>(x_2-x_1,\dots,x_n-x_{n-1})</math>. Napisz procedurę obliczającą ciąg różnicowy żądanej listy liczb całkowitych. | ||
* Napisz procedurę obliczającą listę kolejnych ciągów różnicowych 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 <math>\frac{3}{2} n</math> porównań. | * Napisz procedurę, której wynikiem jest para: minimum i maksimum elementów z listy. Procedura ta powinna wykonywać co najwyżej <math>\frac{3}{2} n</math> porównań. | ||
* 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>? | ||
Linia 27: | Linia 35: | ||
* Zdefiniuj typ reprezentujący dni tygodnia, miesiące i datę. | * 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 <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. | ||
* 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 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. | * Napisz procedurę, która przekształca dane drzewo binarne w wyważone drzewo binarne, zachowując kolejność elementów w porządku infiksowym. |
Wersja z 10:29, 5 paź 2006
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ę rev odwracającą listę. (Zwróć uwagę, że rozwiązując to zadanie można korzystać z :: lub @, co daje liniową lub kwadratową złożoność czasową.)
- 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].
Ć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, np. procedury wyznaczające listy elementów w porządku prefiksowym i postfiksowym.
Laboratorium
Ćwiczenie programistyczne na listy:
- Zaimplementuj procedurę zwracającą -ty element listy.
- Napisz procedurę tworzącą listę pierwszych liczb naturalnych.
- Zaimplementuj procedurę append sklejającą listy.
- Ciąg różnicowy ciągu to ciąg postaci . Napisz procedurę obliczającą ciąg różnicowy żądanej 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ę 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?
- Zaimplementuj sortowanie: przez scalanie lub quick-sort.
- Zaimplementuj pakiet arytmetyczny nieograniczonych liczb całkowitych.
- Lista większościowa to taka lista, na której ponad połowa elementów jest sobie równa, a ich wartość nazywa się właśnie większością. Napisz procedurę wybierającą większość z listy większościowej; uzasadnij jej poprawność.
- Napisz procedurę 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 .
Ćwiczenia na inne struktury danych:
- 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.
- 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.
- Zaimplementuj takie operacje na zbiorach (reprezentowanych jako drzewa BST) jak suma, przecięcie i różnica.
- Rozszerz implementację kolejek o wkładanie i wyjmowanie elementów z obydwu stron. Jaką własność powinna zachowywać procedura balance, aby koszt zamortyzowany operacji był stały?
- Dany jest typ danych reprezentujący (mało efektywnie) liczby naturalne: type nat = ZERO | SUCC of nat;;. Zaimplementuj operacje arytmetyczne na takich liczbach.