2009-09-11 16 views
11

Jestem nowy w Scala, właśnie zacząłem się uczyć, więc to jest podstawowe pytanie dla początkujących.Jak utworzyć listę z zakresu

Próbuję wprowadzić algorytm Sieve of Eratosthenes. Oto co mam do tej pory:

 
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)) 

Wynikiem jest:

 
List(2) 

O ile mi zrozumieć, case _ => cross :: Nil jest dopasowany w pierwszej iteracji sieve_core, co oznacza, że ​​crossed nie jest instancją lista.

Zmieniłem lst parametrów typu do List[Int] a teraz kod nie zostanie skompilowany z błędem:

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

Range Najwyraźniej nie jest List.

Pytanie: w jaki sposób mogę zmienić zakres na listę? Czy jest to jakiś większy problem z moim kodem? Zrobiłem jakieś złe założenie gdzieś po drodze?

Każda pomoc doceniona.

Odpowiedz

28

Jest takie apply metoda na obiekcie List towarzysz który zajmuje zakres i zwraca List:

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

Istnieje wiele przydatnych List metod fabrycznych in the List collection documentation.

+0

Sprawdziłem listę klas apidocs, nie sprawdziłem Lista obiektów docs. Teraz wiem lepiej. Dzięki. –

+2

Wiesz, to bardzo denerwujące, że nie są w żaden sposób powiązane ze sobą ani nawet połączone w jedną stronę :) –

+2

To ma być przestarzałe, jak mi powiedziano. "2 do max toList" zadziała. –

7

Aby włączyć dowolną sekwencję s do listy, użyj s.toList

Jestem pewien digitalross' jest bardziej wydajny w tym przypadku, choć.

+0

W rzeczywistości wydaje się, że jest to Scala Way +1 – DigitalRoss

Powiązane problemy