【问题标题】:Is there a more effective way to check if a number is prime using recursive function?有没有更有效的方法来使用递归函数检查一个数字是否是素数?
【发布时间】:2020-10-16 11:35:59
【问题描述】:

我正在编写一个递归函数来检查非负整数是否是 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))

我的问题是有没有办法让我将一个输入作为函数的参数?代码必须使用递归函数。我知道有更有效的方法来检查一个数字是否为素数(也许使用迭代),但我只是将其作为练习题。

【问题讨论】:

  • 定义有效。您可以预先计算素数然后检查缓存,您可能想要搜索不存在缓存的数字,您可以在内存限制下操作或完全优化速度。根据要求,我们可以回答。
  • 我认为你的函数调用 4 素数。
  • 如果你在谈论时间复杂度,我建议你只将数字除以它的 sqrt,否则你也可以寻找eratosthenes的筛子。

标签: scala recursion primes


【解决方案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)

【讨论】:

    【解决方案2】:

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

    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)
    }
    

    另一个选项是设置一个默认参数。那些不能引用以前的参数,所以你必须使用一种解决方法。这里我传递了一些j,并生成i = x - j,所以我可以从1开始增加j

    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)
      }
    }
    

    不相关的是,您的代码中有一个错误:4 不应该是素数。

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 2020-09-18
      • 2011-02-16
      • 2016-08-08
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      相关资源
      最近更新 更多