首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R用素数校验函数停止工作,箭头消失。

R用素数校验函数停止工作,箭头消失。
EN

Stack Overflow用户
提问于 2022-10-26 21:23:20
回答 2查看 32关注 0票数 0
代码语言:javascript
复制
prime <- function(number){
    if (number!=2){
        for (num in 1:number){
            while ((number%%num)==0){
                counter <- 0
                counter <- counter+1
                
            }
        }
        return((counter-2)==0)
    }else{
        FALSE
    }
}

我的函数是为素数测试而设计的,素数只除以1和1,所以我把所有的数字从1循环到n(数字本身),并计算了0剩余除数。结果必须是2 (n/n和n/1剩馀数为0),因此,如果数字是素数,则(反-2)==0返回TRUE。唯一的例外是2,但是我的代码不能工作,也会停止RStudio。代码行箭头消失,R停止返回任何值。

这个代码有什么问题?

EN

回答 2

Stack Overflow用户

发布于 2022-10-26 21:36:27

我不认为你需要一个循环。另外,我不知道您所说的行箭头消失是什么意思,但是这段代码对我来说是有效的:

代码语言:javascript
复制
is.prime <- function(x){
  if( x == 2) return(TRUE)
  sum(x %% 1:x  == 0) == 2
}

is.prime(2)
#> [1] TRUE

is.prime(10)
#> [1] FALSE

is.prime(11)
#> [1] TRUE
票数 0
EN

Stack Overflow用户

发布于 2022-10-27 00:24:12

您的代码至少有三个问题:

  1. ,您任意将2定义为非素数。它是素数,没有理由将其作为特例来处理。

  1. ,您正在不断地将counter重置为0。它应该在for循环
  2. 之外初始化一次--您的while循环是一个无限循环。如果是(number%%num)==0,那么循环正文中的任何内容都不会使这个错误。这将导致循环成为无限循环,这就是为什么在运行代码时RStudio挂起的原因。修复方法是将这个循环转换为完全不是循环的东西--它实际上是您需要的一个if语句.

还有一件事并不不正确,但有些尴尬:使用(counter - 2) == 0来测试是否counter == 2

修复这些问题会导致以下代码:

代码语言:javascript
复制
prime <- function(number) {
  counter <- 0
  for (num in 1:number) {
    if ((number %% num) == 0) {
      counter <- counter + 1
    }
  }
  counter == 2
}

这成功地正确地测试了素数。请注意,这是一个极其低效的测试。您的测试将使用1,000,000余数运算来将1,000,000非素数分类为非素数,而只要一次运算就足够了--除以2即可。为了提高效率,您可以利用这样一个事实:一个数字要么是素数,要么可以被一个不大于其平方根的数字整除。对于奇数,您可以通过检查它是否有小于或等于其平方根的奇数除数来测试它是否为素数。这将允许您检查大约1,000,000的数字是否为素数,最多有500个剩余操作,而不是您的方法将使用的1,000,000个操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74214379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档