0

我有这段代码应该实现埃拉托色尼筛。从所有数字 >= 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 sievenext 中的论点而if (prime < limit)不是constexpr. 在编译器的每个实例中next,都必须验证对模板参数的递归调用next并推断出模板参数,并且递归永远不会结束。

我是对的还是只是不耐烦?它现在编译了2个多小时,到目前为止消耗了4GB的内存。

如果是这样,有没有办法使递归终止?某种形式的类型擦除?最终目标是建立所有素数的无限范围/视图。

更新:使用无限范围是有意的,没有它就不要提出解决方案。最终目标是无限范围的质数,当您迭代该范围时会懒惰地评估。

4

0 回答 0