【问题标题】:Recursion in a prime generator质数生成器中的递归
【发布时间】:2010-10-04 19:55:08
【问题描述】:

我正在制作一个素数生成器,为了提高效率,我试图只针对我已经找到的素数测试数字,而不是所有数字a <- 2 而不是a &lt;- c(a,i) 进行测试

x <- 3:1000
a <- 2
for (i in x)
 {for (j in a)
  {if (i %% j == 0)
   {next}
  else {a <- unique(c(a,i))}}}
a

【问题讨论】:

标签: r primes


【解决方案1】:

解决方案可能是切掉第二个循环,而是将您建议的素数与整个向量进行比较,例如:

x <- 3:1000
a <- 2
for (i in x) {
  if (!any(i %% a == 0)) {
    a <- c(a,i)
  }
}

这似乎对我有用。

【讨论】:

    【解决方案2】:

    下面是一个使用简单素数函数的非递归模型,它的速度与您在 R 中的速度差不多。它不是循环遍历每个单独的值并测试它的素数,而是删除大块中的所有素数倍数。这将每个后续剩余值隔离为素数。所以,它取出 2x,然后 3x,然后 4 消失了,所以 5x 值消失了。这是在 R 中最有效的方法。

    primest <- function(n){
        p <- 2:n
        i <- 1
        while (p[i] <= sqrt(n)) {
            p <-  p[p %% p[i] != 0 | p==p[i]]
            i <- i+1
        }
        p
    }
    

    (您可能想查看this 堆栈问题,以了解使用筛子的更快方法以及我的函数计时。上面的运行速度将比您正在使用的版本快 50 倍,甚至可能快 500 倍。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2017-05-19
      • 2020-02-09
      • 2013-11-19
      • 2021-09-27
      • 2015-12-23
      • 2012-05-03
      相关资源
      最近更新 更多