Giovedì 2 novembre 2017 (130 min)
Esercizio 1
Partizionare una lista in una coppia di liste dove la prima contiene gli elementi di indice pari e l'altra quelli di indice dispari:
object Alter
extends App
{
def alter
[T
](l:
List[T
]):
(List[T
],
List[T
]) =
{
val k =
(0 until l.
size).
map(i=>
(i,l
(i
))) // inefficiente poiché l(i) richiede tempo O(n) su una lista
val a = k.
filter(c=>c._1%
2 ==
0).
map(_._2
)
val b = k.
filter(c=>c._1%
2 !=
0).
map(_._2
)
(a.
toList,b.
toList)
}
def alter2
[T
](l:
List[T
]):
(List[T
],
List[T
]) =
{
val k =
(0 until l.
size).
zip(l
)
val
(a,b
) = k.
partition(_._1%
2==
0) // come alternativa alle due filter
(a.
map(_._2
).
toList, b.
map(_._2
).
toList)
}
def alter3
[T
](l:
List[T
]):
(List[T
],
List[T
]) =
{ // versione ricorsiva
l match
{
case Nil =>
(Nil,Nil
)
case List(x
) =>
(List(x
),Nil
)
case h::t =>
{
val
(a,b
) = alter3
(t.
tail)
(h::a, t.
head::b
)
}
}
}
val l =
List("A",
"B",
"C",
"D",
"E")
val
(a,b
) = alter3
(l
)
println
(a
) // A, C, E
println
(b
) // B, D
}
Esercizio 2
Calcolo dell'elemento più frequente in una lista:
object Freq
extends App
{
val l =
List(1,
2,
1,
1,
2,
5,
1)
def freq
[T
](l:
List[T
]):T =
{
l.
distinct
.
map(x=>
(x, l.
count(_==x
)))
.
reduce(
(c1,c2
) =>
if (c1._2 > c2._2
) c1
else c2
)
._1
}
def freq2
[T
](l:
List[T
]):T =
{
l.
groupBy(x => x
)
.
toList
.
map(c=>
(c._1, c._2.
size))
.
reduce(
(c1,c2
) =>
if (c1._2 > c2._2
) c1
else c2
)
._1
}
println
(freq
(l
))
println
(freq2
(l
))
}
Esercizio 3
Soluzione dell'esercizio 1 del
compito D dell'esonero dell'11/12/2015 (vedi pagina
Materiale didattico)
object D1 {
def alterna(i:Int)(a: =>Unit)(b: =>Unit):Unit = {
if (i == 0) ()
else {
a
b
alterna(i-1)(a)(b)
}
}
}
Esercizio 4
Soluzione dell'esercizio 2 del
compito D dell'esonero dell'11/12/2015 (vedi pagina
Materiale didattico)
object D2
{
def combineLists
(
a:
List[String],
b:
List[String]):
List[String] =
{
(a,b
) match
{
case (Nil,Nil
) => Nil
case (_,Nil
) => a
case (Nil,_
) => b
case (ha::ta, hb::tb
) =>
(ha+hb
)::combineLists
(ta,tb
)
}
}
}
Esempi uso di metodi su liste
Esempi di uso metodi
sliding e
flatten:
scala> val q = (1 to 10).toList
q: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> q.sliding(2,2)
res2: Iterator[List[Int]] = non-empty iterator
scala> q.sliding(2,2).toList
res3: List[List[Int]] = List(List(1, 2), List(3, 4), List(5, 6), List(7, 8), List(9, 10))
scala> q.sliding(2,1).toList
res4: List[List[Int]] = List(List(1, 2), List(2, 3), List(3, 4), List(4, 5), List(5, 6), List(6, 7), List(7, 8), List(8, 9), List(9, 10))
scala> q.sliding(2,3).toList
res5: List[List[Int]] = List(List(1, 2), List(4, 5), List(7, 8), List(10))
scala> q.sliding(1,1).toList
res6: List[List[Int]] = List(List(1), List(2), List(3), List(4), List(5), List(6), List(7), List(8), List(9), List(10))
scala> q.sliding(1,2).toList
res7: List[List[Int]] = List(List(1), List(3), List(5), List(7), List(9))
scala> q.sliding(1,2).toList.flatten
res8: List[Int] = List(1, 3, 5, 7, 9)
scala> q.tail.sliding(1,2).toList.flatten
res9: List[Int] = List(2, 4, 6, 8, 10)