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 un metodo scalarProd
che, date due vettori rappresentati come
sequenze di Double
, ne calcola il prodotto scalare. Se i vettori
hanno lunghezze diverse, limitare il prodotto scalare al range di
indici validi comuni. Ad esempio: scalarProd(Seq(3,4), Seq(2,9,1)) ==
3*2 + 4*9 == 42
.
Suggerimento: usare ricorsione oppure i metodi delle collezioni (potrebbero essercene di utili anche fra quelli non visti a lezione).
Usare il main di prova incluso nel codice dell’esercitazione scaricato.
Scrivere un metodo isMappedFrom
, applicabile a un Vector
v
che verifica se un altro Vector
m
è
ottenibile da v
applicando la funzione f
a ciascun elemento di v
.
Usare il main di prova incluso nel codice dell’esercitazione scaricato.
Se esistesse un premio Ignobel per l’informatica, questo si piazzerebbe bene.
Scrivere un metodo noobSort
che, dato un Vector
v
di n
elementi di tipo
generico, restituisce la versione ordinata di v
. Per risolvere il problema,
generare tutte le permutazioni degli indici da 0
a n-1
e per
ciascuna permutazione generare il vettore permutato, verificare se è ordinato ed
eventualmente restituirlo.
Suggerimento: per generare le permutazioni degli indici, usare (0 to n-1).permutations
. In alternativa si può permutare direttamente il vettore di input e trovare quella permutazione per cui è ordinato. Si consulti la documentazione delle API Scala per cercare metodi utili.
Usare il main di prova incluso nel codice dell’esercitazione scaricato.
Si vuole aggiungere un costrutto Scala repeat
che, dato un intero n
e un corpo body
, esegue body
per n
volte come nel seguente esempio:
repeat(5) {
println("test")
}
object E1 {
def scalarProd(a:Seq[Double], b:Seq[Double]):Double =
(a zip b).foldLeft(0.0)((acc, pair) => acc + pair._1*pair._2)
def scalarProd2(s:Seq[Double], t:Seq[Double]):Double = {
def aux(l:Seq[(Double,Double)]):Double = {
if (l.isEmpty) 0.0
else l.head._1*l.head._2 + aux(l.tail)
}
aux(s zip t)
}
}
import scala.language.implicitConversions
class MyVec[T](l:Vector[T]) {
def isMappedFrom[S](m:Vector[S], f:T=>S) =
if (l.size != m.size) false
else (0 until l.size).forall(i => m(i) == f(l(i)))
}
object E2 {
implicit def vec2MyVec[T](l:Vector[T]) = new MyVec(l)
}
object E3 {
def noobSort[T](v:Vector[T])(implicit cmp:T=>Ordered[T]) =
v.permutations
.find(x => x == x.sorted)
.get
}
object E4 {
def repeat(n:Int)(body: =>Unit):Unit = {
if (n<1) ()
else {
body
repeat(n-1)(body)
}
}
}