Avec l'intention de l'apprentissage et à la suite de cette question, j'ai resté curieux de la idiomatiques alternatives à la récursion explicite à un algorithme qui vérifie si une liste (ou de la collection) est commandée. (Je vais garder les choses simples ici à l'aide d'un opérateur de les comparer et de les Int type; je voudrais regarder l'algorithme avant de plonger dans les génériques de celui-ci)
La base une version récursive serait (par @Luigi Plinge):
def isOrdered(l:List[Int]): Boolean = l match {
case Nil => true
case x :: Nil => true
case x :: xs => x <= xs.head && isOrdered(xs)
}
Une mauvaise exécution idiomatiques serait:
def isOrdered(l: List[Int]) = l == l.sorted
Un algorithme de remplacement à l'aide de pli:
def isOrdered(l: List[Int]) =
l.foldLeft((true, None:Option[Int]))((x,y) =>
(x._1 && x._2.map(_ <= y).getOrElse(true), Some(y)))._1
Il a l'inconvénient qu'il va comparer pour tous les n éléments de la liste, même s'il pouvait s'arrêter plus tôt après avoir trouvé la première de l'élément. Est-il un moyen de "s'arrêter" pli et, par conséquent, ce qui en fait une meilleure solution?
Tout autre (élégant) les solutions de rechange?