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停止返回任何值。
这个代码有什么问题?
发布于 2022-10-26 21:36:27
我不认为你需要一个循环。另外,我不知道您所说的行箭头消失是什么意思,但是这段代码对我来说是有效的:
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发布于 2022-10-27 00:24:12
您的代码至少有三个问题:
,
,
counter重置为0。它应该在for循环while循环是一个无限循环。如果是(number%%num)==0,那么循环正文中的任何内容都不会使这个错误。这将导致循环成为无限循环,这就是为什么在运行代码时RStudio挂起的原因。修复方法是将这个循环转换为完全不是循环的东西--它实际上是您需要的一个if语句.还有一件事并不不正确,但有些尴尬:使用(counter - 2) == 0来测试是否counter == 2。
修复这些问题会导致以下代码:
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个操作。
https://stackoverflow.com/questions/74214379
复制相似问题