Liste

Implementări cu iteratori

1. Implementați funcția List.filter folosind List.fold_right .

2. Implementați folosind List.fold_left o funcție countif care ia ca parametru o funcție f cu valori boolene și o listă și returnează numărul de elemente pentru care funcția f e adevărată.
Implementați similar o funcție sumif care calculează suma tuturor elementelor (presupuse întregi) pentru care funcția f e adevărată.

3. Implementați funcția List.partition care ia ca parametru o funcție cu valori boolene și o listă și returnează o pereche de liste, cu elementele care satisfac, respectiv nu satisfac funcția f.
Puteți să o scrieți cu un iterator ? Va fi final recursivă sau nu ?

Construirea de liste

4. Implementați o funcție fromto a b care construiește lista tuturor întregilor de la a la b inclusiv. Scrieți o soluție eficientă care folosește un acumulator cu lista parțial construită, pornind de la b și e final recursivă (tail-recursive).

5. Construiți lista de cifre din reprezentarea în baza 10 a unui număr întreg. Scrieți două funcții: a) o funcție care produce lista cifrelor în ordinea normală, de exemplu: f(1453) = [1;4;5;3] și b) în ordine inversă: f(1453) = [3;5;4;1].
Pentru lista cifrelor în ordine normală, implementați o funcție final recursivă (tail-recursive). Aceasta va avea un parametru suplimentar care acumulează lista cifrelor deja prelucrate (listă vidă la primul apel). La fiecare apel recursiv, ultima cifră din număr va fi adăugată în capul listei, până când au fost prelucrate toate cifrele, și lista acumulată poate fi returnată ca rezultat. Urmăriți ca exemplu funcția de inversare a unei liste de la curs.

6. Folosind funcțiile din modulul Random, scrieți o funcție care construiește o listă de n întregi aleatori, fiecare între 0 și b - 1.

Alte probleme cu liste

7. Scrieți o funcție care elimină duplicatele consecutive: ia ca parametru o listă și construiește o listă în care toate secvențele de elemente consecutive egale au fost înlocuite cu un singur element.
Indicație: puteți identifica prin tipar fragmente cu două elemente egale: e1 :: e2 :: t when e1 = e2

8. Scrieți o funcție care compară două liste după următoarea relație de ordine: o listă mai scurtă e "mai mică" decât una mai lungă; dacă lungimile sunt egale, ordonarea e determinată de prima pereche de elemente diferite. Evitați parcurgerea repetată a listelor. Funcția va returna un întreg negativ, 0 sau pozitiv în funcție de ordonarea celor două liste argument.

9. Scrieți o funcție care interclasează două liste, fiecare ordonată crescător, adică returnează lista cu elementele din ambele liste, ordonate.
Comparați primele elemente din ambele liste pentru a decide care va fi primul în rezultat, și apoi continuați cu listele rămase. Puteți da funcției ca parametru o pereche de două liste (l1, l2) și folosi un tipar pentru ambele elemente ale perechii:

let rec merge = function
  | (h1 :: t1, h2 :: t2) -> if h1 < h2 then ...
  | ... alte cazuri ... -> ...

10. Scrieți o funcție care desparte o listă în două liste a căror lungime diferă cu cel mult 1, punând alternativ câte un element în fiecare din liste. (Funcția va returna o pereche de liste).

11. Sortați o listă prin interclasare (mergesort), despărțind lista în două jumătăți, sortând recursiv fiecare din ele, și apoi interclasând cele două liste sortate. Folosiți funcțiile din cele două probleme anterioare.


Marius Minea
Last modified: Fri Oct 11 12:25:00 EEST 2013