Programowanie funkcyjne/Model obliczeń/Ćwiczenia: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
|||
Linia 12: | Linia 12: | ||
==Laboratorium== | ==Laboratorium== | ||
* Napisz procedurę <tt>sześciany: | * Napisz procedurę <tt>sześciany : int -> int list</tt> taką, że wynikiem <tt>sześciany n</tt> jest lista postaci <math> [1^3; 2^3; \dots; n^3]</math>. Rozwiązując to zadanie: | ||
**możesz korzystać wyłącznie z rekurencji ogonowej, | ** możesz korzystać wyłącznie z rekurencji ogonowej, | ||
**jedyne operacje na liczbach, z jakich możesz korzystać to: <tt>+</tt>, <tt>-</tt> oraz porównywanie. | ** jedyne operacje na liczbach, z jakich możesz korzystać to: <tt>+</tt>, <tt>-</tt> oraz porównywanie. | ||
*Napisz procedurę <tt>podziel: int list | * Napisz procedurę <tt>podziel : int list -> int list list</tt>, która dla danej listy <math>[a_1; a_2; \dots; a_n]</math> zawierającej permutację zbioru <math>\{1, 2, \dots, n\}</math> znajdziejej podział na jak najliczniejszą listę list postaci: | ||
<center><math> [[a_1; a_2; \dots; a_{k_1}]; [a_{{k_1}+1}; a_{{k_1}+2}; \dots; a_{k_2}]; \dots; [a_{{k_{m-1}}+1}; a_{{k_{m-1}}+2}; \dots; a_{k_m}]] </math>,</center><br/> taką że:<br/> | <center><math> [[a_1; a_2; \dots; a_{k_1}]; [a_{{k_1}+1}; a_{{k_1}+2}; \dots; a_{k_2}]; \dots; [a_{{k_{m-1}}+1}; a_{{k_{m-1}}+2}; \dots; a_{k_m}]] </math>,</center><br/> | ||
<center><math> | :taką, że:<br/> | ||
\begin{matrix} | <center><math>\begin{matrix} | ||
{a_1, a_2, \dots, a_{k_1}} & = &{1, 2, \dots, k_1} \quad\mbox{(równość zbiorów)}, \\{a_{{k_1}+1}, a_{{k_1}+2}, \dots, a_{k_2}} & = &{k_1+1, k_1+2, \dots, k_2},\\ & \vdots & \\ | \{a_1, a_2, \dots, a_{k_1}\} & = &\{1, 2, \dots, k_1\} \quad\mbox{(równość zbiorów)}, \\ | ||
{a_{{k_{m-1}}+1}, a_{{k_{m-1}}+2}, \dots, a_{k_m}} & = &{k_{m-1}+1, k_{m-1}+2, \dots, k_m} | \{a_{{k_1}+1}, a_{{k_1}+2}, \dots, a_{k_2}\} & = &\{k_1+1, k_1+2, \dots, k_2\},\\ | ||
& \vdots & \\ | |||
\{a_{{k_{m-1}}+1}, a_{{k_{m-1}}+2}, \dots, a_{k_m}\} & = &\{k_{m-1}+1, k_{m-1}+2, \dots, k_m\} | |||
\end{matrix}</math></center> | |||
<br/> | <br/> | ||
Przyjmujemy, że wynikiem dla listy pustej jest lista pusta. | :Przyjmujemy, że wynikiem dla listy pustej jest lista pusta. | ||
:Przykład: <math> \texttt{\mbox{podziel}} [2; 3; 1; 6; 5; 4; 7; 9; 10; 11; 8] = [[2; 3; 1]; [6; 5; 4]; [7]; [9; 10; 11; 8]]</math>. | |||
[[2; 3; 1]; [6; 5; 4]; [7]; [9; 10; 11; 8]]</math | :Rozwiązując to zadanie powinieneś skorzystać z rekurencji, ale wolno Ci korzystać wyłącznie z rekurencji ogonowej. | ||
Rozwiązując to zadanie powinieneś skorzystać z rekurencji, ale wolno Ci korzystać wyłącznie z rekurencji ogonowej. |
Wersja z 14:22, 4 wrz 2006
Ćwiczenia
- Porównaj foldr i foldl. Która z nich jest ogonowa?
- Potęgowanie liczb - liniowe i logarytmiczne, ogonowe.
- Rozważ standardowe procedury przetwarzania list: length, map, append,rev. Czy w ich przypadku definicja ogonowa zmniejsza złożoność pamięciową?
- Potęgowanie funkcji - najpierw liniowe, potem logarytmiczne, ale obie wersje z rekurencją ogonową. Rozrysować w jaki sposób oblicza się:
iterate 2 (function x -> x * (x+1)) 2 iterate 3 (function x -> x * (x+1)) 1
(w zależności od wersji, cierpliwości i powierzchni tablic :-). W przypadku wersji logarytmicznej, procedura wynikowa jest obliczana w czasie logarytmicznym, ale ona sama działa w czasie liniowym.
Laboratorium
- Napisz procedurę sześciany : int -> int list taką, że wynikiem sześciany n jest lista postaci . Rozwiązując to zadanie:
- możesz korzystać wyłącznie z rekurencji ogonowej,
- jedyne operacje na liczbach, z jakich możesz korzystać to: +, - oraz porównywanie.
- Napisz procedurę podziel : int list -> int list list, która dla danej listy zawierającej permutację zbioru znajdziejej podział na jak najliczniejszą listę list postaci:
- taką, że:
- Przyjmujemy, że wynikiem dla listy pustej jest lista pusta.
- Przykład: .
- Rozwiązując to zadanie powinieneś skorzystać z rekurencji, ale wolno Ci korzystać wyłącznie z rekurencji ogonowej.