Skip to content
Snippets Groups Projects
Forked from joel.cavat / scala2020
1 commit ahead of the upstream repository.
fp.scala 3.30 KiB

/*
 * Implémenter les fonctions suivantes en suivant les commentaires.
 * Respectez également les consignes suivantes:
 *  - Toutes les fonctions doivent être pures
 *  - Tout doit être immutable (val au lieu de var)
 *  - Utiliser la recursion terminale si possible
 *  - Utiliser le pattern matching si possible
 */
object Serie3 {

  /*
   * Donne la longueur d'une liste. Votre implémentation ne peut
   *  utiliser aucune fonction de List excepté isEmpty()
   */
  def len[A]( as: List[A] ): Int = {
    def lenRec(as: List[A], size: Int): Int = {
        as match {
          case Nil => size
          case _ :: rest => lenRec(rest, size+1)
        }    
    }
    lenRec(as, 0)
  }

  /*
   * Donne la longueur d'une liste. Votre implémentation ne peut
   * utiliser aucune fonction de List excepté: -
   *    - isEmpty
   *    - ::
   *    - head
   *    - tail
   */
  def rev[A]( as: List[A] ): List[A] = {
    def revRec(as: List[A], newL: List[A]): List[A] = {
      as match {
        case Nil => newL
        case v :: rest => revRec(rest, v :: newL)
      }
    }
    revRec(as, List.empty[A])
  }

  /*
   * Donne la longueur d'une liste. Votre implémentation ne peut
   * utiliser aucune fonction de List excepté: -
   *    - isEmpty
   *    - head
   *    - tail
   */
  def sum( xs: List[Int] ): Int = {
    def sumRec(xs: List[Int], sum: Int): Int = {
      xs match {
          case Nil => sum
          case v :: rest => sumRec(rest, sum+v)
        }
    }
    sumRec(xs, 0)
  }

  /*
   *  Retourne vrai si et seulement si la liste xs ne
   *  comprend que des valeures vraies. Votre implémentation 
   *  ne peutcutiliser aucune fonction de List excepté:
   *    - isEmpty
   *    - head
   *    - tail
   */
  final def and( xs: List[Boolean] ): Boolean = xs match {
    case Nil => true
    case false :: _ => false
    case _ :: rest => and(rest)
  }

  /*
   *  Applatit une liste. Votre implémentation 
   *  ne peut utiliser aucune fonction de List excepté:
   *   - isEmpty
   *   - head
   *   - tail
   *   - ++
   */
  def flat[A]( las: List[List[A]] ): List[A] = {
    def flatRec(las: List[List[A]], flatten: List[A]): List[A] = {
      las match {
        case Nil => flatten
        case as :: rest => flatRec(rest, flatten ++ as)
      }
    }
    flatRec(las, List.empty[A])
  }

  /*
   *  Applatit une liste. Votre implémentation 
   *  ne peut utiliser aucune fonction de List !
   *  Vous devez utiliser le pattern matching.
   */
  final def even[A]( as: List[A] ): Boolean = {
    as match {
        case Nil => true
        case _ :: _ :: rest => evenRec(rest)
        case _ :: Nil => false
      }
  }
}

object Serie3Main extends App {

  import Serie3._

  val is = List( 1, 2, 3, 4, 5 )
  val bs1 = List( true, true, false, true )
  val bs2 = List( true, true, true )
  val las1 = List.empty[List[Int]]
  val las2 = List( List(1,2), List(3), List(4,5) )

  require( rev(is) == List( 5, 4, 3, 2, 1 ) )

  require( len(is) == 5 )
  require( len( las1 ) == 0 )
  require( len( bs1 ) == 4 )

  require( flat(las1) == Nil )
  require( flat(las2) == is )

  require( sum(is) == 15 )
  require( sum(flat(las2)) == sum(is) )

  require( rev( bs1 ) == List( true, false, true, true ) )
  require( rev( bs2 ) == bs2 )

  require( even( is ) == false )
  require( even( bs1 ) == true )
  require( even( las1 ) == true )

}