Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 有没有更有效的方法使用递归函数检查一个数是否为素数?_Scala_Recursion_Primes - Fatal编程技术网

Scala 有没有更有效的方法使用递归函数检查一个数是否为素数?

Scala 有没有更有效的方法使用递归函数检查一个数是否为素数?,scala,recursion,primes,Scala,Recursion,Primes,我正在编写一个递归函数来检查非负整数在SCALA中是否为素数。我的函数需要两个输入。这是我的密码: import io.StdIn._ def isPrime (x:Int, i:Int): Boolean = { if (i < 3) { true }else if (x % i == 0) { false }else{ isPrime(x,i-1) } } print("Enter a number to check if it is

我正在编写一个递归函数来检查非负整数在SCALA中是否为素数。我的函数需要两个输入。这是我的密码:

import io.StdIn._
def isPrime (x:Int, i:Int): Boolean = {
  if (i < 3) {
    true
  }else if (x % i == 0) {
    false
  }else{
    isPrime(x,i-1)
  }
}

print("Enter a number to check if it is a prime number: " )
val num1 = readInt()
println(isPrime(num1,num1-1))
导入io.StdIn_
def isPrime(x:Int,i:Int):布尔={
如果(i<3){
真的
}else如果(x%i==0){
假的
}否则{
iPrime(x,i-1)
}
}
打印(“输入一个数字以检查它是否是质数:”)
val num1=readInt()
println(isPrime(num1,num1-1))

我的问题是,有没有办法将一个输入作为函数的参数?代码必须使用递归函数。我知道有更有效的方法来检查一个数是否为素数(可能使用迭代),但我只是把它作为一个实践问题来做。

我甚至可以说,用调用函数包装递归函数是非常好的,即使是标准实践。例如:

def isPrime( x:Int ) = { 
  def recIsP( n:Int, i:Int ) : Boolean = i == n || n % i != 0 && recIsP(n, i + 1) 
  recIsP(x,2) 
}

isPrime(3301)

一种选择是创建一个内部方法

def isPrime(x:Int): Boolean = {
  def loop(i: Int): Boolean = 
    if (i<3 ) {
      true
    } else if (x % i==0) {
      false
    } else {
      isPrime(x,i-1)
    }
  loop(x, x - 1)
}

您的代码中有一个错误:4不应该是prime。

Define effective。您可以预先计算素数,然后检查缓存,您可能希望搜索不存在缓存的数字,您可以在内存限制下操作,或者完全优化速度。根据需求,我们可以回答这个问题。我认为你的函数调用4是素数。如果你说的是时间复杂度,我建议你只将数字除以sqrt,否则你也可以寻找埃拉托斯烯筛。
def isPrime(x: Int, j: Int = 1): Boolean = {
  val i = x - j
  if (i < 3) {
    true
  } else if (x % i==0) {
    false
  } else {
    isPrime(x, j + 1)
  }
}