2

の倍数であるような値が少なくとも 1 つ存在する場合Lは要素を保持したいリストが与えられ、それ以外の場合は破棄する必要があります。L(i)j > iL(j)L(i)L(i)

命令型プログラミング パラダイムを使用してそれを行うのは非常に簡単ですが、私は関数型プログラミングを使用してそれを行いたいと考えています。

メソッドを使用することは可能filterですか?もしそうなら、条件(つまりfilter関数のパラメータ)をどのように書くのですか?それ以外の場合は、どうすればよいですか?

4

2 に答える 2

4

例えば:

val l = (1 to 100)
l.tails.collect { case (head +: tail) if tail.exists(_ % head == 0) => head } .toList

tail各ステップで入力から 1 要素を引いた値を返すイテレータを生成します。

(1 to 10).tails.foreach(println)

与える

Vector(1, 2, 3, 4)
Vector(2, 3, 4)
Vector(3, 4)
Vector(4)
Vector()

これらの「テール」は、フィルターを適用するヘッド要素として表示でき、ヘッドを保持するかどうかを調べるために使用されるテール自体を表示できます。

このcollectメソッドは部分関数を使用するため、ここで役立ちます。したがって、実際に値を保持するケースのみを指定する必要がありfilterますmap。収集されます。

したがって、少なくとも 1 つの head 要素と任意のサイズの tail を持つ tail を照合し、その tail に head の倍数である要素が存在するかどうかを確認できます。ここでは一致の場合にガードを使用するため、一致は二重フィルターになります。1 つ目は末尾が空でないこと、2 つ目は複数でなければならないことです。倍数は、モジュラスがゼロであることを意味します。大文字と小文字が一致する場合は、検証済みの head 要素のみを返します。

最後に、特定の型注釈がないcollectと、別のイテレータが返されるだけなので、結果を でリストに変換しtoListます。

于 2013-03-31T21:17:51.490 に答える