Programowanie funkcyjne/Zadania egzaminacyjne: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 1: | Linia 1: | ||
Propozycje zadań egzaminacyjnych: | Propozycje zadań egzaminacyjnych: | ||
* Napisz procedurę <tt>posumuj</tt>, która dla danej niemalejącej listy dodatnich liczb całkowitych <math>(a_1 \dots a_n)</math> oblicza listę <math>(b_1 \dots b_n)</math>, gdzie <math>b_i = \sum_{k=a_i}^n a_k</math>. (Pamiętaj o tym, że jeśli <math>m>n</math>, <math>\sum_{k=m}^n a_k = 0</math>.) | * Napisz procedurę <tt>posumuj</tt>, która dla danej niemalejącej listy dodatnich liczb całkowitych <math>(a_1 \dots a_n)</math> oblicza listę <math>(b_1 \dots b_n)</math>, gdzie <math>b_i = \sum_{k=a_i}^n a_k</math>. (Pamiętaj o tym, że jeśli <math>m>n</math>, <math>\sum_{k=m}^n a_k = 0</math>.) | ||
* 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ę <tt>słupki</tt>, 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. | * 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ę <tt>słupki</tt>, 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ę <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: | * 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> | <center><math> | ||
Linia 24: | Linia 29: | ||
: 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>. | : 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. | : Rozwiązując to zadanie powinieneś skorzystać z rekurencji, ale wolno Ci korzystać wyłącznie z rekurencji ogonowej. | ||
* 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, $i$ powtórzeń liczby $k$ reprezentujemy w ciągu skompresowanym jako <math>2^{i-1} \cdot (2 \cdot k - 1)</math>. | |||
: Napisz procedurę <tt>kompresuj: int list -> int list</tt> kompresującą zadaną listę. Lista wynikowa powinna być oczywiście jak najkrótsza. | |||
: Rozwiązując to zadanie nie wolno Ci tworzyć żadnych własnych procedur rekurencyjnych. Powinieneś natomiast użyć procedur wyższych rzędów przetwarzających listy, znanych z wykładów. | |||
: Przykład: <tt>kompresuj [1; 2; 2; 5; 11; 11; 2] = [1; 6; 9; 42; 3]</tt>. | |||
* Zdefiniuj w sposób uwikłany strumień złożony z tych dodatnich liczb całkowitych, które w rozkładzie na czynniki pierwsze mają tylko liczby 2 i 3, oraz rozkładają się na nieparzystą liczbę czynników pierwszych. | * Zdefiniuj w sposób uwikłany strumień złożony z tych dodatnich liczb całkowitych, które w rozkładzie na czynniki pierwsze mają tylko liczby 2 i 3, oraz rozkładają się na nieparzystą liczbę czynników pierwszych. |
Wersja z 20:19, 15 wrz 2006
Propozycje zadań egzaminacyjnych:
- Napisz procedurę posumuj, która dla danej niemalejącej listy dodatnich liczb całkowitych oblicza listę , gdzie . (Pamiętaj o tym, że jeśli , .)
- 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 Twoja procedura?
- Napisz procedurę przedziały:int list -> int*int, która dla danej listy oblicza taką parę liczb , , dla której suma 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 zawierającej permutację zbioru znajdzie jej podział na jak najliczniejszą listę list postaci:
- taką że:
- 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.
- 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, $i$ powtórzeń liczby $k$ reprezentujemy w ciągu skompresowanym jako .
- Napisz procedurę kompresuj: int list -> int list kompresującą zadaną listę. Lista wynikowa powinna być oczywiście jak najkrótsza.
- Rozwiązując to zadanie nie wolno Ci tworzyć żadnych własnych procedur rekurencyjnych. Powinieneś natomiast użyć procedur wyższych rzędów przetwarzających listy, znanych z wykładów.
- Przykład: kompresuj [1; 2; 2; 5; 11; 11; 2] = [1; 6; 9; 42; 3].
- Zdefiniuj w sposób uwikłany strumień złożony z tych dodatnich liczb całkowitych, które w rozkładzie na czynniki pierwsze mają tylko liczby 2 i 3, oraz rozkładają się na nieparzystą liczbę czynników pierwszych.