Question

Je suis nouveau à Scala, je viens tout juste d’apprendre, c’est donc une question de base pour débutant.

J'essaie d'implémenter l'algorithme Sieve of Eratosthenes . Voici ce que j'ai obtenu jusqu'à présent:

def sieve_core(cross: Int, lst: Seq[Int]): List[Int] = {
    val crossed = lst.filter(_ % cross != 0)
    crossed match {
            case a :: rest => cross :: sieve_core(a, crossed)
            case _ => cross :: Nil
    }
}

def sieve(max: Int): List[Int] = {
    sieve_core(2, (2 to max))
}

println(sieve(100))

Le résultat est:

List(2)

Autant que je sache, case _ = > cross :: Nil correspond à la première itération de sieve_core , ce qui signifie que croisé n'est pas une instance d'une liste.

J'ai changé le type de paramètre lst en List [Int] et maintenant, le code ne sera pas compilé avec une erreur:

(fragment of Problem3.scala):24: error: type mismatch;
 found   : Range.Inclusive
 required: List[Int]
    sieve_core(2, (2 to max))
                      ^

Apparemment, Range n'est pas une liste .

Question: comment puis-je transformer Range en liste? Ou est-ce un gros problème avec mon code, j'ai fait une mauvaise hypothèse quelque part en cours de route?

Toute aide appréciée.

Était-ce utile?

La solution

Il existe une méthode apply sur l'objet compagnon List qui prend une plage et renvoie une List :

scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)

Il existe de nombreuses méthodes d'usine List utiles dans la documentation de la collection List .

Autres conseils

Pour transformer une séquence s en liste, utilisez s.toList

Je suis sûr que digitalross est plus efficace dans ce cas, cependant.

(2 à max) n'est pas un scala.collection.immutable.List , mais un scala.collection.immutable.Range , plus précisément une instance de scala.collection.immutable.Range.Inclusive , comme indiqué dans votre Message d'erreur. En passant, notez que Inclusive et Exclusif sont eux-mêmes membres de Range , avec une signification assez explicite.

Heureusement, la classe Range propose la méthode pratique toList , que vous pouvez utiliser pour convertir la plage en liste et résoudre le problème, comme dans l'extrait de code suivant:

scala> val max = 10
max: Int = 10

scala> val r = (2 to max)
r: scala.collection.immutable.Range.Inclusive = Range 2 to 10

scala> val l = r.toList
l: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top