scala> last(List(1, 1, 2, 3, 5, 8))
res0: Int = 8
pour avoir un résultat ci-dessus, j'ai écrit ce code:
val yum = args(0).toInt
val thrill:
def last(a: List[Int]): List[Int] = {
println(last(List(args(0).toInt).last)
}
Quel est le problème avec ce code?
Vous pouvez utiliser last
, qui retourne le dernier élément ou jette une NoSuchElementException
, si la liste est vide.
scala> List(1, 2, 3).last
res0: Int = 3
Si vous ne savez pas si la liste est vide ou non, vous pouvez envisager d'utiliser lastOption
, qui renvoie Option
.
scala> List().lastOption
res1: Option[Nothing] = None
scala> List(1, 2, 3).lastOption
res2: Option[Int] = Some(3)
Votre question concerne List
, mais l'utilisation de last
sur une collection infinie (par exemple, Stream.from(0)
) peut être dangereuse et entraîner une boucle infinie.
Une autre version sans utiliser last
(pour une raison quelconque, vous pourriez en avoir besoin).
def last(L:List[Int]) = L(L.size-1)
Tu ferais mieux de faire:
val a = List(1,2,3) //your list
val last = a.reverse.head
Plus propre et moins sujet aux erreurs :)
La dernière fonction récursive devrait suivre 2 propriétés. Votre dernier fonction n'en a aucun.
Exigence n ° 1. Une condition de sortie qui n'appelle pas la fonction récursive Plus loin.
Exigence n ° 2 Un appel récursif qui réduit les éléments avec lesquels nous avons commencé.
Voici les problèmes que je vois avec d'autres solutions.
Je vais le changer comme ci-dessous.
def last(a: List[Int]): Int = a match {
//The below condition defines an end condition where further recursive calls will not be made. requirement #1
case x::Nil => x
//The below condition reduces the data - requirement#2 for a recursive function.
case x:: xs => last(xs)
}
last(List(1,2,3))
Résultat
res0: Int = 3
Albiet, c’est une question très ancienne, il est peut-être utile de penser que l’impact des performances de la tête et des dernières opérations semble être exposé ici http://docs.scala-lang.org/overviews/collections/performance-characteristics.html .