(* * Kolokwium z "Jezykow i paradygmatow programowania" * * Bartosz Chodorowski <166142@student.pwr.wroc.pl> * * 21 stycznia 2010 *) (* Zadanie 1 *) let rec odw = function | [] -> [] | a::b -> odw(b)@[a] ;; (* Zadanie 2 i *) let rec przedzial min max = if (min > max) then failwith "przedzial" else if (min==max) then [min] else min::(przedzial (min+1) max) ;; (* Zadanie 2 ii *) let rec filtr p = function | [] -> [] | a::b -> if (p a) then a::(filtr p b) else filtr p b ;; (* Zadanie 2 iii *) let rec sito n = function | [] -> [] | a::b -> if (a mod n == 0) then sito n b else a::(sito n b) ;; (* Zadanie 3 *) let rec palindrom input = (* pal sprawdza, czy lista jest palindromem *) let pal list = let r = (List.rev list) in if (r = list) then true else false in (* zapisuje liczbe jako liste cyfr dziesietnych *) let rec decimal n = if (n<10) then [n] else (decimal (n/10))@[n mod 10] in (* zapisuje liste cyfr dziesietnych jako liczbe -- przy pierwszym * wywolaniu podac podst=1 *) let rec rev_decimal podst l = let revl = List.rev l in match l with | [] -> 0 | _ -> (List.hd revl)*podst + (rev_decimal (podst*10) (List.rev (List.tl revl))) in (* dla liczby zwraca nastepny palindrom zapisany w postaci listy *) let rec palindrom_ number = let l = decimal (number+1) in if (pal l) then l else palindrom_ (number+1) in (* wystarczy wywolac palindrom_ i zamienic liste na liczbe * dodatkowo unikamy wartosci ujemnych *) if (input<0) then failwith "palindrom" else rev_decimal 1 (palindrom_ input) ;;