我是Scala的新手,刚刚开始学习,所以这是一个基本的初学者问题 .
我尝试实现Sieve of Eratosthenes算法 . 这是我到目前为止所得到的:
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))
结果是:
List(2)
据我所知, case _ => cross :: Nil
在 sieve_core
的第一次迭代中匹配,这意味着 crossed
不是List的实例 .
我将 lst
参数类型更改为 List[Int]
,现在代码将无法编译并显示错误:
(fragment of Problem3.scala):24: error: type mismatch;
found : Range.Inclusive
required: List[Int]
sieve_core(2, (2 to max))
^
显然 Range
不是 List
.
问题:如何将Range转换为List?或者我的代码是一个更大的问题,我在某个地方做了一些不好的假设?
任何帮助赞赏 .
2 回答
List
伴侣对象上有一个apply
方法,该方法占用一个范围并返回List
:有很多有用的
List
工厂方法in the List collection documentation .要将任何序列
s
转换为列表,请使用s.toList
不过,我确信digitalross'在这种情况下更有效率 .