Programowanie funkcyjne/Zadania egzaminacyjne: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Kubica (dyskusja | edycje)
Nie podano opisu zmian
 
Kubica (dyskusja | edycje)
Nie podano opisu zmian
Linia 4: Linia 4:
* Napisz funkcję <tt>max_diff : int list <math>\to</math> int</tt>, która dla niepustej listy <math>[x_1; \dots; x_n]</math> znajdzie maksymalną różnicę <math>x_j - x_i</math> dla <math>1 \le i \le j \le n</math>. Jaką złożoność ma Twoja procedura?
* Napisz funkcję <tt>max_diff : int list <math>\to</math> int</tt>, która dla niepustej listy <math>[x_1; \dots; x_n]</math> znajdzie maksymalną różnicę <math>x_j - x_i</math> dla <math>1 \le i \le j \le n</math>. Jaką złożoność ma Twoja procedura?
* Napisz procedurę <tt>przedziały:int list -> int*int</tt>, która dla danej listy <math>[a_1, \dots, a_n]</math> oblicza taką parę liczb <math>(k,l)</math>, <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.
* Napisz procedurę <tt>przedziały:int list -> int*int</tt>, która dla danej listy <math>[a_1, \dots, a_n]</math> oblicza taką parę liczb <math>(k,l)</math>, <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.
* 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> znajdzie jej 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>
: taką że:
<center><math>
\begin{array}{rcl}
\{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_{{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{array}
</math></center>
: Przyjmujemy, że wynikiem dla listy pustej jest lista pusta.
: Przykład: <tt>podziel [2; 3; 1; 6; 5; 4; 7; 9; 10; 11; 8] = [[2; 3; 1]; [6; 5; 4]; [7]; [9; 10; 11; 8]]</tt>.
: Rozwiązując to zadanie powinieneś skorzystać z rekurencji, ale wolno Ci korzystać wyłącznie z rekurencji ogonowej.

Wersja z 20:14, 15 wrz 2006

Propozycje zadań egzaminacyjnych:

  • Napisz procedurę posumuj, która dla danej niemalejącej listy dodatnich liczb całkowitych (a1an) oblicza listę (b1bn), gdzie bi=k=ainak. (Pamiętaj o tym, że jeśli m>n, k=mnak=0.)
  • 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 [x1;;xn] znajdzie maksymalną różnicę xjxi dla 1ijn. Jaką złożoność ma Twoja procedura?
  • Napisz procedurę przedziały:int list -> int*int, która dla danej listy [a1,,an] oblicza taką parę liczb (k,l), 1kln, dla której suma ak++al jest największa. Oblicz i podaj złożoność Twojego rozwiązania.
  • Napisz procedurę podziel: int list -> int list list, która dla danej listy [a1;a2;;an] zawierającej permutację zbioru {1,2,,n} znajdzie jej podział na jak najliczniejszą listę list postaci:
[[a1;a2;;ak1];[ak1+1;ak1+2;;ak2];;[akm1+1;akm1+2;;akm]]
taką że:
{a1,a2,,ak1}={1,2,,k1}(równość zbiorów),{ak1+1,ak1+2,,ak2}={k1+1,k1+2,,k2},{akm1+1,akm1+2,,akm}={km1+1,km1+2,,km}
Przyjmujemy, że wynikiem dla listy pustej jest lista pusta.
Przykład: podziel [2; 3; 1; 6; 5; 4; 7; 9; 10; 11; 8] = [[2; 3; 1]; [6; 5; 4]; [7]; [9; 10; 11; 8]].
Rozwiązując to zadanie powinieneś skorzystać z rekurencji, ale wolno Ci korzystać wyłącznie z rekurencji ogonowej.