Kotlinの公式ドキュメントにあるパイプライン処理で素数を求める例がどうしてもわからないので、解説いただけないでしょうか?
公式ドキュメントへのリンクはこちらになります。
公式ドキュメントに載っているコードは以下です。
kotlin
1import kotlinx.coroutines.* 2import kotlinx.coroutines.channels.* 3 4fun main() = runBlocking { 5 var cur = numbersFrom(2) 6 repeat(10) { 7 val prime = cur.receive() 8 println(prime) 9 cur = filter(cur, prime) 10 } 11 coroutineContext.cancelChildren() // cancel all children to let main finish 12} 13 14fun CoroutineScope.numbersFrom(start: Int) = produce<Int> { 15 var x = start 16 while (true) send(x++) // infinite stream of integers from start 17} 18 19fun CoroutineScope.filter(numbers: ReceiveChannel<Int>, prime: Int) = produce<Int> { 20 for (x in numbers) if (x % prime != 0) send(x) 21}
出力結果が、以下のようになります。
2 3 5 7 11 13 17 19 23 29
おそらく2以降のすべての自然数を一つ一つ素数で割っていって、割り切れるかどうかを確かめているのかと思いますが、なぜこの結果になるのかわかりません。
filter
を再起的に代入しているので、filter
内のnumbers
のループが2回目以降のrepeat
の中では素数のループになる?しかし走査はすべての自然数で行わないといけないし...と頭がこんがらがって処理の順番がよくわかりません。
例えば、filter
の中でxが9、primeが2の場合とかは普通に9が素数としてsendされてしまわないでしょうか?
どなたかこちらのサンプルを理解できたという方は詳しく解説いただけないでしょうか。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/14 02:07