我有这段代码应该实现埃拉托色尼筛。从所有数字 >= 2 开始。获取第一个数字 (2),打印它并删除它的所有倍数。获取第二个数字 (3),打印并删除它的所有倍数。等等。
#include <iostream>
#include <ranges>
template<int limit>
void next(auto sieve) {
int prime = sieve.front();
if (prime < limit) {
std::cout << " " << prime;
next<limit>(sieve | std::views::filter([prime](const auto& value) { return value % prime != 0; }));
}
}
int main() {
std::cout << "Primes:";
next<100>(std::views::iota(2));
std::cout << std::endl;
}
递归仅限于显示小于 100 的素数。或者是吗?
我认为这段代码是完全有效的,但永远不会完成编译。
这样做的原因是auto sieve
next 中的论点而if (prime < limit)
不是constexpr
. 在编译器的每个实例中next
,都必须验证对模板参数的递归调用next
并推断出模板参数,并且递归永远不会结束。
我是对的还是只是不耐烦?它现在编译了2个多小时,到目前为止消耗了4GB的内存。
如果是这样,有没有办法使递归终止?某种形式的类型擦除?最终目标是建立所有素数的无限范围/视图。
更新:使用无限范围是有意的,没有它就不要提出解决方案。最终目标是无限范围的质数,当您迭代该范围时会懒惰地评估。