uniroma1.E*Main.scala.cognome.nome. Sulle postazioni del laboratorio sarà /home/studente/Desktop/cognome.nome/.cognome.nome.zip (zip -r cognome.nome.zip cognome.nome/).cognome.nome.zip.Per maggiori informazioni fate riferimento al regolamento delle esercitazioni.
Scrivere una funzione sommaFun(f1:Double=>Double, f2:Double=>Double):Double=>Double
che restituisce la funzione somma di f1 ed f2. Ad esempio:
sommaFun(x=>x, x=>x+1)(2) == 5 (ottenuto come: 2+(2+1)),
sommaFun(x=>2*x, x=>x+2)(3) == 11 (ottenuto come: (2*3)+(3+2))
Per compilare da riga di comando usare: scalac E1Main.scala E1.scala. Si noti che sulla riga di comando ci sono entrambi i file che compongono il programma. Noterete la presenza di vari file .class generati dalla compilazione.
Per eseguire il programma da riga di comando usare: scala E1Main. Si noti che, come in Java, al comando scala viene passato il nome della classe.
Scrivere una funzione corrisp[A,B](a:List[A], b:List[B], f:A=>B):Boolean che
restituisce true se e solo se per ogni indice i comune a entrambe le liste vale
b(i)=f(a(i)). Se una lista è più lunga dell’altra, gli elementi in eccedenza devono essere
ignorati.
Scrivere la soluzione nel file E2.scala e usare il programma di prova E2Main.scala.
Scrivere una funzione maxPrefisso(l:List[Int], x:Int):Int Scala che restituisce il
più grande numero n tale che la somma dei primi n numeri di l è minore o uguale a x.
Ad esempio, maxPrefisso(List(1,1,1,1,1),3) == 3, maxPrefisso(List(5,2,4,7),8)==2 e
maxPrefisso(List(5,2,4,7),4)==0.
Scrivere la soluzione nel file E3.scala e usare il programma di prova E3Main.scala.
Una sequenza bitonica è formata da una sequenza non vuota strettamente crescente
seguita da una sequenza non vuota strettamente decrescente, ad esempio:
List(1,2,5,6,9,4,3,2,0) è bitonica, mentre List(1,2,3,2,3,2,1), List(1,2,3) e List()
non lo sono.
Scrivere una funzione checkBitonic(l:List[Int]):(List[Int],List[Int]) che, data una
lista l bitonica, restituisce (inc,dec) tale che inc è il prefisso crescente di
l che include l’elemento massimo e dec è il suffisso strettamente decrescente che
segue (si ha che inc ::: dec == l). Se invece l non è bitonica, la
funzione restituisce (Nil,Nil).
Scrivere la soluzione nel file E4.scala e usare il programma di prova E4Main.scala.
object E1 {
def sommaFun(f1:Double=>Double, f2:Double=>Double) = (x:Double) => f1(x)+f2(x)
}
object E2 {
def corrisp[A,B](a:List[A], b:List[B], f:A=>B) = a.zip(b).forall(t=>t._2 == f(t._1))
}
object E3 {
def maxPrefisso(l:List[Int], x:Int) = {
def aux(t:List[Int], s:Int, n:Int):Int =
if (t.isEmpty || s + t.head > x) n
else aux(t.tail, s + t.head, n+1)
aux(l, 0, 0)
}
}
object E4 {
def checkBitonic(l:List[Int]):(List[Int], List[Int]) = {
val m = Int.MinValue
val maxTriple =
((m::l):+m).zipWithIndex.sliding(3,1).toList.
filter(t=>t(0)._1 < t(1)._1 && t(1)._1 > t(2)._1)
if (maxTriple.length != 1) (Nil,Nil)
else {
val s:Int = maxTriple.head(1)._2
(l.take(s),l.drop(s))
}
}
}
oppure, più conciso ma asintoticamente più inefficiente (sorted richiede tempo O(n log n)):
object E4 {
def checkBitonic(l:List[Int]):(List[Int], List[Int]) = {
if (l.isEmpty) (Nil,Nil)
else {
val (a,b) = l.splitAt(l.indexOf(l.max)+1)
if (a.sorted != a || b.reverse.sorted.reverse != b) (Nil,Nil)
else (a,b)
}
}
}