Programmazione Funzionale e Parallela

Corso di Laurea in Ingegneria Informatica e Automatica - A.A. 2017-2018

HomePage | Avvisi | Diario lezioni | Materiale didattico | Esami | Forum | Login

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:

Alter.scala
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:

Freq.scala
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)

D1.scala
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)

D2.scala
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)


Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.1372 seconds