Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Kotlin中使用generateSequence的素数生成函数不容易理解:(_Kotlin_Sequence_Primes_Lazy Sequences - Fatal编程技术网

在Kotlin中使用generateSequence的素数生成函数不容易理解:(

在Kotlin中使用generateSequence的素数生成函数不容易理解:(,kotlin,sequence,primes,lazy-sequences,Kotlin,Sequence,Primes,Lazy Sequences,我试图了解这个函数的工作原理,但对我来说并不容易。 有人能解释一下它是如何工作的吗?谢谢。它使用“埃拉托斯坦筛”(见这里:)生成无限序列的素数 此实现使用对序列来完成此操作。每对的第一个元素是当前素数,第二个元素是大于该素数的整数序列,该素数不能被任何先前素数整除 它从对2到[3,5,7,9,11,13,15,17,…]开始,由2给出以生成序列(3){It+2}。 使用这一对,我们通过取序列的第一个元素(现在是3),然后从序列中删除所有可被3整除的数字(删除9、15、21等等),来创建序列的下一

我试图了解这个函数的工作原理,但对我来说并不容易。
有人能解释一下它是如何工作的吗?谢谢。

它使用“埃拉托斯坦筛”(见这里:)生成无限序列的素数

此实现使用对序列来完成此操作。每对的第一个元素是当前素数,第二个元素是大于该素数的整数序列,该素数不能被任何先前素数整除

它从对
2到[3,5,7,9,11,13,15,17,…]
开始,由
2给出以生成序列(3){It+2}
。 使用这一对,我们通过取序列的第一个元素(现在是3),然后从序列中删除所有可被3整除的数字(删除9、15、21等等),来创建序列的下一对。这给了我们这一对:
3到[5、7、11、13、17,
。重复此模式将给我们所有的素数

在创建了这样的成对序列之后,我们最终将执行
.map{it.first}
以仅拾取实际的素数,而不是内部序列

成对的序列将演变如下:

val primes = generateSequence(2 to generateSequence(3) {it + 2}) {
  val currSeq = it.second.iterator()
  val nextPrime = currSeq.next()
  nextPrime to currSeq.asSequence().filter { it % nextPrime != 0}
}.map {it.first}
println(primes.take(10).toList()) // prints [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

欢迎使用stackoverflow。请不要要求解释一段代码,因为它对其他人可能没有什么价值。请参阅此处:一般建议:签出,首先了解generateSequence的功能,并尝试尽可能多地分解您不理解的函数。请解释!希望OP不会感觉太糟糕如果你不习惯函数式编程,这很聪明,但也不容易理解。非常感谢。现在我完全理解了generateSequences的工作原理!虽然不是Eratosthenes,但是(或者Quarendon,但是Turner更出名)
2 to [3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, ...]
3 to [5, 7, 11, 13, 17, 19, 23, 25, 29, ...]
5 to [7, 11, 13, 17, 19, 23, 29, ...]
7 to [11, 13, 17, 19, 23, 29, ...]
11 to [13, 17, 19, 23, 29, ...]
13 to [17, 19, 23, 29, ...]
// and so on