Esercizi di SMLStandard ML of New Jersey, Version 110.0.3 (unix)
NOTA: 't e' un tipo di variabile non definito.
1) data una lista di interi definire una funzione
che calcoli la somma degli interi pari
(funzione arieta' 1 - somma ricorsiva)
fun par ([]) = 0
| par (h::l) =
if (h mod 2) = 0 then h + par([l])
else par([l]);
2) come prima con una funzione di arieta' 2
fun par (a,b) =
if null(a) then b
else if (hd(a) mod 2) = 0 then par(tl(a), hd(a) + b)
else par(tl(a),b);
PROVA:
val par = fn : int list * int -> int
- par([1,2,3,4,5],0);
val it = 6 : int
3) definire un tipo lista di liste di interi e calcolare
la lista delle somme dei valori delle liste
type ll = int list list;
fun sum ([]) = 0
| sum (h::l) = h + sum(l);
fun sumll ([]) = []
| sumll (h::l)=sum(h)::sumll(l);
PROVA:
- sumll([[1,2,3],[1,2],[9]]);
val it = [6,3,9] : int list
3b) sapreste definire una funzione di ordine superiore in SML per fare cio'?
map sum [[1,2],[2]];
val it = [3,2] : int list
definire in SML un tipo lista di coppie tali che la prima componente
di ogni coppia sia un booleano e la seconda componente un intero.
type boolint = bool*int list;
Definire una funzione SML tale che, data una lista del tipo precedente, calcoli
sia la somma dei valori interi nelle coppie con prima componente true che la somma
dei valori interi nelle coppie con prima componente false
type boolint2 = bool * int;
fun sumtf ([],_) = 0
| sumtf ((h:boolint2)::t, true) =
if ((#1)h = true) then (#2)h + sumtf (t,true)
else sumtf (t,true)
| sumtf ((h:boolint2)::t, false) =
if ((#1)h = false) then (#2)h + sumtf (t,false)
else sumtf (t,false);
PROVA:
sumtf ([(true,2),(true,7),(false,1)],true);
val it = 9 : int
sumtf ([(true,2),(true,7),(false,1)],false);
val it = 1 : int
Semplice funzione che testa se un albero ternario e' foglia oppure no.
datatype ttree = foglia | node of ttree*ttree*ttree;
fun tfoglia(foglia) = true
= | tfoglia (node(_,_,_)) = false;
val tfoglia = fn : ttree -> bool
tfoglia (node ((node(foglia,foglia,foglia), foglia, foglia)));
val it = false : bool
Definire in SML un tipo di albero ternario con nodi etichettati sugli interi.
Definire una funzione SML tale che, dato un albero del tipo precedente, calcoli
la somma dei valori sulla frontiera e determini se tale somma e' superiore al
valore intero che etichetta la radice.
datatype Ttree = vuoto | node of int * Ttree * Ttree * Ttree;
fun summa (a,vuoto,vuoto, vuoto) = (a, true)
| summa (a,node(b),node(c), node(d)) =
if (a < (((#1)(summa(b))) + ((#1)(summa(c))) + ((#1)(summa(d)))))
then (((#1)(summa(b))) + ((#1)(summa(c))) + ((#1)(summa(d))),true)
else (((#1)(summa(b))) + ((#1)(summa(c))) + ((#1)(summa(d))),false);
val summa = fn : int * Ttree * Ttree * Ttree-> int * bool
- summa (1,node(3,vuoto,vuoto,vuoto), node(4,vuoto,vuoto,vuoto), vuoto);
val it = (7,true) : int * bool
- summa (8,node(3,vuoto,vuoto,vuoto), node(4,vuoto,vuoto,vuoto), vuoto);
val it = (7,false) : int * bool
Definire in SML un tipo di albero ternario con nodi etichettati sugli interi.
Definire una funzione SML tale che, dato un albero del tipo precedente, calcoli
il massimo dei valori sui nodi interni.
UNDER CONSTRUCTION
datatype Ttree = vuoto | node of int * Ttree * Ttree;
fun maxNode(a, vuoto, vuoto) = a
| maxNode(a, node(b), node(c))=
if ((a > ((#1)(maxNode(node(b)))) andalso (a > ((#1)(node(c))))) then a
elsif ((#1)(maxNode(node(b))) > (#1)(maxNode(node(c))))
then (maxNode(node(b))) else (maxNode(node(c)));
© C o p y r i g h
t 1 9 9 4 - 2 0 0 4
w w w . d i z i o n a r i o i n f o r m a t i c o . c o m |
 |
|