在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