Programowanie funkcyjne/Procedury wyższych rzędów/Ćwiczenia: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
|||
Linia 24: | Linia 24: | ||
==Laboratorium== | ==Laboratorium== | ||
* Korzystając z <tt>filter</tt> zaimplementuj Quick-sort. | * Korzystając z <tt>filter</tt> zaimplementuj Quick-sort. | ||
* Niech <math>f : {\cal R} \to {\cal R}</math> będzie funkcją 1--1 i "`na'' oraz taką, że <math>f(0) = 0</math>, <math>f</math> jest rosnąca i <math>|f(x)| \ge |x|</math>. Zaimplementuj procedurę <tt>odwrotność</tt>, której wynikiem dla parametru <math>f</math> będzie przybliżenie <math>f^{-1}</math> z dokładnością zadaną przez stałą <tt>epsilon</tt> (czyli jeśli <math>g = (<tt>odwrotność </tt> f)</math>, to <math>\forall x\ |g(x) - f^{-1}(x)| \le <tt>epsilon</tt></math>). | * Niech <math>f : {\cal R} \to {\cal R}</math> będzie funkcją 1--1 i "`na'' oraz taką, że <math>f(0) = 0</math>, <math>f</math> jest rosnąca i <math>|f(x)| \ge |x|</math>. Zaimplementuj procedurę <tt>odwrotność</tt>, której wynikiem dla parametru <math>f</math> będzie przybliżenie <math>f^{-1}</math> z dokładnością zadaną przez stałą <tt>epsilon</tt> (czyli jeśli <math>g = (<tt>odwrotność </tt> f)</math>, to <math>\forall x\ |g(x) - f^{-1}(x)| \le <tt>epsilon</tt></math>). |
Wersja z 12:12, 18 lip 2006
Ćwiczenia
- Zapisz procedurę length za pomocą foldr.
- Zapisz procedurę append za pomocą foldr/foldl.
- Za pomocą foldl zapisz procedurę rev.
- suma listy funkcji,
- złożenie listy funkcji,
- Za pomocą map zapisz procedurę heads, której wynikiem dla danej listy list, jest lista pierwszych elementów list składowych.
- Za pomocą filter zaimplementuj procedurę not_divisivble, która pozostawia na liście wszystkie elementy niepodzielne przez zadaną liczbę.
- Wykorzystaj rozwiązanie poprzedniego zadania do zaimplementowania sita Eratostenesa.
- Za pomocą foldr zapisz flatten. (let flatten l = foldr (@) l [];;)
- Za pomocą foldl zapisz procedurę foldr.
- Dane są: definicja typu tree i procedura fold_tree:
type tree = Node of tree * int * tree | Leaf;; let rec fold_tree f a t = match t with Leaf -> a | Node (l, x, r) -> f x (fold_tree f a l) (fold_tree f a r);;
Powiemy, że liczba w węźle drzewa jest widoczna, jeżeli na ścieżce od tego węzła do korzenia drzewa nie ma większej liczby. W szczególności liczba w korzeniu drzewa jest zawsze widoczna, a liczby mniejsze od niej nie są nigdy widoczne.
- Napisz procedurę widoczne:drzewo int, która dla zadanego drzewa (zawierającego wyłącznie liczby nieujemne) obliczy liczbę widocznych liczb. Rozwiązując to zadanie nie wolno Ci tworzyć żadnych definicji rekurencyjnych. Powinieneś natomiast skorzystać z procedury fold_tree.
Laboratorium
- Korzystając z filter zaimplementuj Quick-sort.
- Niech będzie funkcją 1--1 i "`na oraz taką, że , jest rosnąca i . Zaimplementuj procedurę odwrotność, której wynikiem dla parametru będzie przybliżenie z dokładnością zadaną przez stałą epsilon (czyli jeśli Parser nie mógł rozpoznać (błąd składni): {\displaystyle g = (<tt>odwrotność </tt> f)} , to ).
- Wygładzenie funkcji z odstępem polega na uśrednieniu , i . Napisz procedurę wygładzającą daną funkcję z zadanym odstępem.
- Punktem stałym funkcji jest . Zaimplementuj obliczanie -tego pierwiastka z za pomocą obliczania punktu stałego i tłumienia przez uśrednianie. Uwaga: ile razy należy stosować tłumienie w zależności od ?
- 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, powtórzeń liczby reprezentujemy w ciągu
- skompresowanym jako .
- Napisz procedury
- kompresującą i dekompresującą
- zadaną listę.
- Lista skompresowana powinna być oczywiście jak najkrótsza.
- Przy dekompresji możesz założyć, że lista skompresowana
- nie zawiera zer.
- Rozwiązując to zadanie, zamiast rekurencji, należy użyć
- standardowych procedur wyższych rzędów przetwarzających
- listy.
- \begin{flushleft} \tt
- kompresuj [1; 2; 2; 5; 11; 11; 2];;
- - : int list = [1; 6; 9; 42; 3]*;\end{flushleft}
- Napisz odpowiedniki \codeline{map} i filter dla drzew.*;Rozważ drzewa binarne i drzewa o wierzchołkach dowolnego
- skończonego stopnia (por.\ ćw.\ do poprzedniego wykładu).