質問

私はScalaを初めて使用し、学習を始めたばかりなので、これは基本的な初心者の質問です。

エラトステネスのふるいアルゴリズムを実装しようとしています。ここに私がこれまでに得たものがあります:

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 ではありません。

質問:範囲をリストにするにはどうすればよいですか?それとも私のコードに大きな問題がありますか?途中で何らかの悪い仮定を立てましたか?

ご協力ありがとうございます。

役に立ちましたか?

解決

List コンパニオンオブジェクトには apply メソッドがあり、範囲を取得して List を返します:

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

多くの便利な List ファクトリメソッドがあります List コレクションドキュメント内。

他のヒント

任意のシーケンス s をリストに変換するには、 s.toList

を使用します

ただし、この場合はdigitalrossの方が効率的であると確信しています。

(2 to max) scala.collection.immutable.List 確かに scala.collection.immutable.Range 、より正確には scala.collection.immutable.Range.Inclusive のインスタンス。エラーメッセージ。ちなみに、 Inclusive Exclusive は、それ自体が Range のメンバーであり、かなり自動で説明されている意味です。

幸い、Rangeクラスは便利なメソッド toList を提供します。これを利用して、範囲をリストに変換し、次のコードスニペットのように問題を解決できます。

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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top