我在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
答案 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