Я реализовал Решето Эратосфена в Котлине для генерации простых чисел. Я заметил проблему, из-за которой вторая версия моего кода работает неправильно, и недоумеваю, почему в выводе отсутствует цифра 4.
Вот код, который работает правильно:
val primes: Sequence = sequence {
var numbers = generateSequence(2) { it + 1 }
Log.d("testsss", "Initial numbers: ${numbers.take(10).toList()}") // Initial numbers
while (true) {
val prime = numbers.first()
Log.d("testsss", "Current prime: $prime")
yield(prime)
numbers = numbers.drop(1).filter { it % prime != 0 }
Log.d("testsss", "After filtering with prime $prime: ${numbers.take(10).toList()}") // After filtering
}
}
val primesList = primes.take(10).toList()
Log.d("testsss", "Final primes: $primesList")
println(primesList)
Initial numbers: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Current prime: 2
After filtering with prime 2: [3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
Current prime: 3
After filtering with prime 3: [5, 7, 11, 13, 17, 19, 23, 25, 29, 31]
Current prime: 5
After filtering with prime 5: [7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
Current prime: 7
After filtering with prime 7: [11, 13, 17, 19, 23, 29, 31, 37, 41, 43]
Current prime: 11
After filtering with prime 11: [13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
Current prime: 13
After filtering with prime 13: [17, 19, 23, 29, 31, 37, 41, 43, 47, 53]
Current prime: 17
After filtering with prime 17: [19, 23, 29, 31, 37, 41, 43, 47, 53, 59]
Current prime: 19
After filtering with prime 19: [23, 29, 31, 37, 41, 43, 47, 53, 59, 61]
Current prime: 23
After filtering with prime 23: [29, 31, 37, 41, 43, 47, 53, 59, 61, 67]
Current prime: 29
Final primes: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
val primes: Sequence = sequence {
var numbers = generateSequence(2) { it + 1 }
Log.d("testsss", "Initial numbers: ${numbers.take(10).toList()}") // Initial numbers
var prime: Int
while (true) {
prime = numbers.first()
Log.d("testsss", "Current prime: $prime")
yield(prime)
numbers = numbers.drop(1).filter { it % prime != 0 }
Log.d("testsss", "After filtering with prime $prime: ${numbers.take(10).toList()}") // After filtering
}
}
val primesList = primes.take(10).toList()
Log.d("testsss", "Final primes: $primesList")
println(primesList)
Initial numbers: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Current prime: 2
After filtering with prime 2: [3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
Current prime: 3
After filtering with prime 3: [5, 7, 8, 10, 11, 13, 14, 16, 17, 19]
Current prime: 5
After filtering with prime 5: [6, 7, 8, 9, 11, 12, 13, 14, 16, 17]
Current prime: 6
After filtering with prime 6: [7, 8, 9, 10, 11, 13, 14, 15, 16, 17]
Current prime: 7
After filtering with prime 7: [8, 9, 10, 11, 12, 13, 15, 16, 17, 18]
Current prime: 8
After filtering with prime 8: [9, 10, 11, 12, 13, 14, 15, 17, 18, 19]
Current prime: 9
After filtering with prime 9: [10, 11, 12, 13, 14, 15, 16, 17, 19, 20]
Current prime: 10
After filtering with prime 10: [11, 12, 13, 14, 15, 16, 17, 18, 19, 21]
Current prime: 11
After filtering with prime 11: [12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
Current prime: 12
Final primes: [2, 3, 5, 6, 7, 8, 9, 10, 11, 12]
Я понимаю, что из-за ленивой оценки последовательностей Kotlin часть фильтра ссылается на неправильные простые значения. Однако если ленивая оценка фильтра происходит для всех простых чисел, то должно появиться 4. Если фильтр был применен правильно для простого числа = 2, последующие числа, кратные 2, например 6, 8, 10 и 12, не должны появляться в результатах. Какую ошибку я могу допустить в своем понимании?
Я реализовал Решето Эратосфена в Котлине для генерации простых чисел. Я заметил проблему, из-за которой вторая версия моего кода работает неправильно, и недоумеваю, почему в выводе отсутствует цифра 4. Вот код, который работает правильно: [code]val primes: Sequence = sequence { var numbers = generateSequence(2) { it + 1 } Log.d("testsss", "Initial numbers: ${numbers.take(10).toList()}") // Initial numbers
while (true) { val prime = numbers.first() Log.d("testsss", "Current prime: $prime") yield(prime) numbers = numbers.drop(1).filter { it % prime != 0 } Log.d("testsss", "After filtering with prime $prime: ${numbers.take(10).toList()}") // After filtering } }
val primesList = primes.take(10).toList() Log.d("testsss", "Final primes: $primesList") println(primesList) [/code] Журналы рабочего кода следующие: [code]Initial numbers: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11] Current prime: 2 After filtering with prime 2: [3, 5, 7, 9, 11, 13, 15, 17, 19, 21] Current prime: 3 After filtering with prime 3: [5, 7, 11, 13, 17, 19, 23, 25, 29, 31] Current prime: 5 After filtering with prime 5: [7, 11, 13, 17, 19, 23, 29, 31, 37, 41] Current prime: 7 After filtering with prime 7: [11, 13, 17, 19, 23, 29, 31, 37, 41, 43] Current prime: 11 After filtering with prime 11: [13, 17, 19, 23, 29, 31, 37, 41, 43, 47] Current prime: 13 After filtering with prime 13: [17, 19, 23, 29, 31, 37, 41, 43, 47, 53] Current prime: 17 After filtering with prime 17: [19, 23, 29, 31, 37, 41, 43, 47, 53, 59] Current prime: 19 After filtering with prime 19: [23, 29, 31, 37, 41, 43, 47, 53, 59, 61] Current prime: 23 After filtering with prime 23: [29, 31, 37, 41, 43, 47, 53, 59, 61, 67] Current prime: 29 Final primes: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] [/code] А вот код, который работает неправильно: [code]val primes: Sequence = sequence { var numbers = generateSequence(2) { it + 1 } Log.d("testsss", "Initial numbers: ${numbers.take(10).toList()}") // Initial numbers
var prime: Int while (true) { prime = numbers.first() Log.d("testsss", "Current prime: $prime") yield(prime) numbers = numbers.drop(1).filter { it % prime != 0 } Log.d("testsss", "After filtering with prime $prime: ${numbers.take(10).toList()}") // After filtering } }
val primesList = primes.take(10).toList() Log.d("testsss", "Final primes: $primesList") println(primesList) [/code] Журналы проблемного кода: [code]Initial numbers: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11] Current prime: 2 After filtering with prime 2: [3, 5, 7, 9, 11, 13, 15, 17, 19, 21] Current prime: 3 After filtering with prime 3: [5, 7, 8, 10, 11, 13, 14, 16, 17, 19] Current prime: 5 After filtering with prime 5: [6, 7, 8, 9, 11, 12, 13, 14, 16, 17] Current prime: 6 After filtering with prime 6: [7, 8, 9, 10, 11, 13, 14, 15, 16, 17] Current prime: 7 After filtering with prime 7: [8, 9, 10, 11, 12, 13, 15, 16, 17, 18] Current prime: 8 After filtering with prime 8: [9, 10, 11, 12, 13, 14, 15, 17, 18, 19] Current prime: 9 After filtering with prime 9: [10, 11, 12, 13, 14, 15, 16, 17, 19, 20] Current prime: 10 After filtering with prime 10: [11, 12, 13, 14, 15, 16, 17, 18, 19, 21] Current prime: 11 After filtering with prime 11: [12, 13, 14, 15, 16, 17, 18, 19, 20, 21] Current prime: 12 Final primes: [2, 3, 5, 6, 7, 8, 9, 10, 11, 12] [/code] Я понимаю, что из-за ленивой оценки последовательностей Kotlin часть фильтра ссылается на неправильные простые значения. Однако если ленивая оценка фильтра происходит для всех простых чисел, то должно появиться 4. Если фильтр был применен правильно для простого числа = 2, последующие числа, кратные 2, например 6, 8, 10 и 12, не должны появляться в результатах. Какую ошибку я могу допустить в своем понимании?