有人能解释一下为什么下面的Kotlin代码会产生不正确的预期结果吗?

42fyovps  于 2023-02-09  发布在  Kotlin
关注(0)|答案(1)|浏览(103)

有人能解释一下为什么下面的代码会产生[2,3,5,7,11,13,17,19,23,29]吗?我知道这和filter函数有关,它被推迟到最后一个元素,但是我没有看到图片。如果你能把它可视化就更好了。非常感谢。

val primes: Sequence<Int> = sequence {
    var numbers = generateSequence(2) { it + 1 }

    var prime: Int
    while (true) {
        prime = numbers.first()
        yield(prime)
        numbers = numbers.drop(1).filter { it % prime != 0 }
    }
}
print(primes.take(10).toList())
0yycz8jy

0yycz8jy1#

这是因为你改变了闭包中的变量,例如,在第二步中,你把numbers作为.filter { it % prime != 0 }.filter { it % prime != 0 },但是prime是一个变量,它等于3
正确版本:

val primes: Sequence<Int> = sequence {
    var numbers = generateSequence(2) { it + 1 }

    while (true) {
        val prime = numbers.first()
        yield(prime)
        numbers = numbers.drop(1).filter { it % prime != 0 }
    }
}
print(primes.take(10).toList())

相关问题