2009-09-11 9 views
11

Je suis nouveau à Scala, je viens de commencer à apprendre, donc c'est une question de base pour les débutants. J'essaie d'implémenter l'algorithme Sieve of Eratosthenes. Voici ce que je suis arrivé à ce jour:Comment créer une liste à partir de la plage

 
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) 

Pour autant que je comprends, case _ => cross :: Nil est adaptée à la première itération de sieve_core, ce qui signifie que crossed n'est pas une instance de une liste.

j'ai changé le type lst de paramètres à List[Int] et maintenant le code ne compilera pas 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 un List. Question: comment puis-je transformer Range en Liste? Ou est-ce un plus gros problème avec mon code, j'ai fait une mauvaise supposition quelque part le long du chemin?

Toute aide appréciée.

Répondre

28

Il y a une méthode apply sur l'objet compagnon List qui prend une gamme et retourne une List:

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

Il y a beaucoup de List utiles méthodes d'usine in the List collection documentation.

+0

J'ai vérifié les classes apidocs, je n'ai pas vérifié les documents de l'objet List. Maintenant, je sais mieux. Merci. –

+2

Vous savez, c'est super ennuyeux comment ils ne sont pas liés les uns aux autres, ou même combinés dans une seule page :) –

+2

Ceci est censé être déprécié, on me dit. '2 to max toList' fonctionnera. –

7

Pour activer une séquence s dans une liste, utilisez s.toList

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

+0

En fait, cela semble être la façon Scala +1 – DigitalRoss

Questions connexes