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 ?
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.
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.