(* Sa se desparta o lista intr-o lista de fragmente de cate k elemente *) (* Ca prim pas e util sa facem o functie care returneaza o pereche: primele (cel mult) k elemente si restul listei *) (* Scriem o functie auxiliara cu acumulator in care vom pune primele elemente in ordine inversa, decrementand si contorul *) let rec prime r k = function h :: t when k > 0 -> (* mai avem elemente si in lista si de luat *) prime (h::r) (k-1) t (* pune primul element in acumulator *) lst -> (List.rev r, lst) (* altfel (lista vida sau k = 0) returneaza acumulatorul inversat si lista ramasa *) (* solutia are tot un acumulator pentru lista de liste desparte la fiecare pas primele k *) let fragment k = (* k constant ramane parametru la functia exterioara *) let rec frag2 r = function (* functia ajutatoare are acumulatorul r *) [] -> List.rev r (* gata, returnam acumulatorul inversat *) lst -> let (prim, rest) = prime [] k lst (* sigur macar o bucata *) in frag2 (prim :: r) rest (* acumulam fragmentul si continuam *) in frag2 [] ;; fragment 3 [1;2;3;4;5;6;7] (* [[1; 2; 3]; [4; 5; 6]; [7]] *)
This document was generated using caml2html