User Tools

Site Tools


ex-l2-sol

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
ex-l2-sol [2014/10/06 12:21]
giovanni.casu created
ex-l2-sol [2015/10/08 15:20] (current)
Line 1: Line 1:
-  - Definire una variabile di tipo tripla di interi +  - Definire una variabile di tipo tripla di interi<​code ocaml>
-<code ocaml>+
  let x = (1,2,3);;  let x = (1,2,3);;
- 
  let x = 1,2,3 ;;  let x = 1,2,3 ;;
 </​code>​ </​code>​
-  - 2. Definire una funzione che, data in ingresso una tripla, ne restitusca il secondo elemento+  - Definire una funzione che, data in ingresso una tripla, ne restitusca il secondo elemento<​code ocaml>
-<code ocaml>+
 let f (a,b, c) = a;; let f (a,b, c) = a;;
 </​code>​ </​code>​
- +  ​- Definire una funzione che abbia il seguente tipo:  ​''​int * int -> float * float''<​code ocaml>
-  ​- Definire una funzione che abbia il seguente tipo:  int * int -> float * float +
  let f (n,m) = if (n + m = 1) then (2.0 , 3.0)  let f (n,m) = if (n + m = 1) then (2.0 , 3.0)
 else (2.0, 3.0);; else (2.0, 3.0);;
-  ​- Definire una funzione che abbia il seguente tipo:  string * string -> int -> int+</​code>​ 
 +  ​- Definire una funzione che abbia il seguente tipo:  ​''​string * string -> int -> int''<​code ocaml>
 let f (a, b) n = if (a^b = “”) then n+1 else n-1;; let f (a, b) n = if (a^b = “”) then n+1 else n-1;;
-  - Definire una funzione f :  int -> int -> int -> int * int * int  che, dati tre numeri interi, restituisca il massimo, il minimo e la media di essi in una tripla.  ​ 
-<code ocaml> 
- let max a b = if (a>b) then a else b;; 
- let min a b = if (a>b) then b else a;; 
- let f a b c = ( (let t = max a b in max t c),  
- (let s = min a b in min s c),  
-(a + b + c )/ 3, );; 
-  
 </​code>​ </​code>​
-  - Definire una funzione f :  int -> int -> int -> int * int * int  che, dati tre numeri interi, restituisca il massimo, il minimo e la media di essi in una tripla.  ​ +  - Definire una funzione ​''​f :  int -> int -> int -> int * int * int'' ​ che, dati tre numeri interi, restituisca il massimo, il minimo e la media di essi in una tripla ​(se ne presentano 3 soluzioni)<​code ocaml> 
- +let max a b = if (a>b) then a else b;; 
- let max a b = if (a>b) then a else b;; +let min a b = if (a>b) then b else a;; 
- let min a b = if (a>b) then b else a;; +let f a b c = ( (let t = max a b in max t c),  
- let f a b c = ( max c (max a b), + (let s = min a b in min s c),  
- min c (min a b), +(a + b + c )/ 3 );;  
 +</​code><​code ocaml> 
 +let max a b = if (a>b) then a else b;; 
 +let min a b = if (a>b) then b else a;; 
 +let f a b c = ( max c (max a b), 
 +min c (min a b), 
 (a + b + c )/ 3 );; (a + b + c )/ 3 );;
-  - Definire una funzione f :  int -int -int -> int * int * int  che, dati tre numeri interi, restituisca il massimo, il minimo e la media di essi in una tripla.  ​+</code><code ocaml>
 let f x y z = let max a b = if (a >b) then a else b in let f x y z = let max a b = if (a >b) then a else b in
 let m = max x y in let massimo = max m z in let m = max x y in let massimo = max m z in
 let min i o = if (i <o) then i else o in let min i o = if (i <o) then i else o in
 let n = min x y in let minimo = min n z in let n = min x y in let minimo = min n z in
-                    let media = (x+y+z)/3 in +let media = (x+y+z)/3 in 
 (massimo, minimo , media);; (massimo, minimo , media);;
-  ​- Definire una funzione f: bool → bool → bool → int tale che f e1 e2 e3 restituisca n se  n delle espressioni booleane in ingresso sono vere. Es: f true (2>3) (2+2=4) restituisce 2+</​code> ​                  
- +  ​- Definire una funzione ​''​f: bool → bool → bool → int'' ​tale che ''​f e1 e2 e3'' ​restituisca ​''​n'' ​se ''​n'' ​delle espressioni booleane in ingresso sono vere. Es: ''​f true (2>3) (2+2=4)'' ​restituisce ​''​2''<​code ocaml> 
- let isTrue e = if e then 1 else 0;; +let isTrue e = if e then 1 else 0;; 
- let f e1 e2 e3 = isTrue e1 + isTrue e2 + isTrue e3;; +let f e1 e2 e3 = isTrue e1 + isTrue e2 + isTrue e3;; 
- +let f e1 e2 e3 = let d = if e1 then 1 else 0 in  
- let f e1 e2 e3 = let d = if e1 then 1 else 0 in  +let e = if e2 then 1 else 0 in 
- let e = if e2 then 1 else 0 in +
 let f = if e3 then 1 else 0 in d + e + f;;  ​ let f = if e3 then 1 else 0 in d + e + f;;  ​
-  ​- Definire una funzione ricorsiva che termini e che  abbia il seguente tipo:  float -> int -> float +</​code>​ 
-let rec  f  m n = if ( n = 0 ) then 2.0 else f 1.0 (n-1) ;;  +  ​- Definire una funzione ricorsiva che termini e che  abbia il seguente tipo:  ​''​float -> int -> float''<​code ocaml> 
-  - Definire le seguenti funzioni di base, su interi positivi o nulli:+let rec  f  m n = if ( n = 0 ) then 2.0 else f 1.0 (n-1) ;; 
 +</​code> ​ 
 +  - Definire le seguenti funzioni di base, su interi positivi o nulli:<code ocaml>
 let iszero n =  n=0 ;; let iszero n =  n=0 ;;
 let succ n = n+1;; let succ n = n+1;;
 let pred n = if (n=0) then 0 else n-1;; let pred n = if (n=0) then 0 else n-1;;
-  ​- Utilizzando le funzioni di base definite al punto precedente, ​ definire le seguenti funzioni utilizzando la ricorsione.+</​code>​ 
 +  ​- Utilizzando le funzioni di base definite al punto precedente, ​ definire le seguenti funzioni utilizzando la ricorsione.<code ocaml>
 let rec leq n m = if (iszero n) then true else  let rec leq n m = if (iszero n) then true else 
 if (iszero m) then false else  if (iszero m) then false else 
-leq (pred n) (pred m);; +    ​leq (pred n) (pred m);; 
 +</​code><​code ocaml>
 let eq n m = if(iszero n && iszero m) then true else  let eq n m = if(iszero n && iszero m) then true else 
 if(iszero n || iszero m) then false else if(iszero n || iszero m) then false else
 eq (pred n) (pred m);;  eq (pred n) (pred m);; 
 +</​code><​code ocaml>
 let eq n m = (leq n m) && (leq m n);; let eq n m = (leq n m) && (leq m n);;
- +</​code><​code ocaml>
- +
 let rec add n m = if (iszero m) then n  let rec add n m = if (iszero m) then n 
 else add (succ n) (pred m);; else add (succ n) (pred m);;
- +</​code><​code ocaml>
-let rec add n m = if (iszero m) then n  +
-else succ ( add( pred n)  m);; +
- +
- +
- +
 let rec sub n m = if (leq  n m) then 0 else  let rec sub n m = if (leq  n m) then 0 else 
 if (iszero m) then n else sub (pred n) (pred m);;  if (iszero m) then n else sub (pred n) (pred m);; 
- 
 let rec sub n m =  let rec sub n m = 
-if (iszero m) then n else sub (pred n) (pred m);;  +if (iszero m) then n else sub (pred n) (pred m);; 
- +</​code><​code ocaml> 
- +let rec mul n m = if (iszero ​n) then 0                    ​ 
-let rec mul1 n m acc = if (iszero ​m) then 0 else  +else add m (mul (pred nm);;   
-if (eq m 1) then then acc else n (prec m(add n acc);; +</​code><​code ocaml> 
-let mul n m = mul1 n m 0;; +let rec pow n m = if (iszero ​m)                   ​ 
- +then 1 else mul (pow (pred m));; 
-let rec mul n m = if (iszero ​nthen 0                    else add m (mul (pred nm);; Sbagliato: ​ +</​code><​code ocaml> 
-let rec mul n m = if iszero ​m then n else  +let rec ack = 
-  then mul (add n n ) (pred m) ;; +  ​if m=0 then (n+1) else 
- +  if n=0 then (ack (m-11) else 
-mul 10 0 = 10 ???? +  (ack (m-1) (ack m (n-1))
-mul 4 5 ,  mul 8 4 , mul 16 3 , mul 32 2, mul 64 1, mul 128 +</​code>​ 
- +  - Non tail recursive:<​code ocaml> 
-  let rec pow n m = if (iszero m                   ​then 1 else mul n (pow n (pred m));;+let rec f x =  if x=0 then 
 +                 else if x>0 then 1 + f (1-x) 
 +                      else 1 + f (-1-x);; 
 +</​code>​ 
 +Tail recursive:<​code ocaml> 
 +let rec f2 x acc if x = 0 then acc  
 +else if (x < 0) then f2 (-1-x) (1+acc) ​else f2 (1-x) (1+acc);; 
 +let rec f3 x= f2 x 0;; 
 +</​code>​
ex-l2-sol.txt · Last modified: 2015/10/08 15:20 (external edit)