素数检查

时间:2014-11-02 16:06:04

标签: recursion f# functional-programming primes primality-test

我在F#中使用我的素数检查器时遇到了一些问题。它似乎没有给出正确的结果所以我猜我已经搞砸了某个地方的逻辑,但我无法弄清楚在哪里。实现是一个简单的暴力强制之一,因此逻辑并不复杂,我之前在命令式语言中使用for循环实现了类似的解决方案。

let rec isPrime iterator (n : int) = 
                            match iterator with
                            | 1 -> isPrime (iterator + 1) n
                            | a when a = n -> isPrime (iterator + 1) n
                            | _ -> match n % iterator = 0 with
                                    | true -> false
                                    | false -> isPrime (iterator + 1) n

1 个答案:

答案 0 :(得分:3)

正如您在评论中已经想到的那样,问题是当迭代器到达true时函数应该终止并说n。实际上,您可以通过迭代到n或至少n/2的平方根来加快速度,因为当您到达n/2时,您知道它将是一个素数。

这种逻辑使用if而不是match似乎更容易编写 - 虽然您可以通过修复match中的案例轻松修复它,但我可能会写一些东西像:

let rec isPrime iterator (n : int) = 
  if iterator = n / 2 then true
  elif iterator = 1 then isPrime (iterator + 1) n
  elif n % iterator = 0 then false
  else isPrime (iterator + 1) n

此外,您可能不希望将iterator参数公开给用户 - 您可以使用嵌套函数编写代码,该函数调用以iterator = 2开头的循环(然后您不需要完全是iterator = 1案例:

let isPrime (n : int) = 
  let rec loop iterator = 
    if iterator = n/2 then true
    elif n % iterator = 0 then false
    else loop (iterator + 1)
  loop 2