Recursion 素数检查
我在F#中的质数检查器有一些问题。它似乎没有给出正确的结果,所以我猜我把逻辑搞砸了,但我不知道在哪里。该实现是一个简单的强制执行,因此逻辑并不复杂,我以前在命令式语言中使用for循环实现过类似的解决方案Recursion 素数检查,recursion,f#,functional-programming,primes,primality-test,Recursion,F#,Functional Programming,Primes,Primality Test,我在F#中的质数检查器有一些问题。它似乎没有给出正确的结果,所以我猜我把逻辑搞砸了,但我不知道在哪里。该实现是一个简单的强制执行,因此逻辑并不复杂,我以前在命令式语言中使用for循环实现过类似的解决方案 let rec isPrime iterator (n : int) = match iterator with | 1 -> isPrime (iterator + 1) n
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
正如您在注释中已经指出的,问题是当迭代器到达
n
时,函数应该终止并说true
。实际上,只要迭代到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
大小写):
正如您在注释中已经指出的,问题是当迭代器到达
n
时,函数应该终止并说true
。实际上,只要迭代到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
大小写):
正如您在注释中已经指出的,问题是当迭代器到达
n
时,函数应该终止并说true
。实际上,只要迭代到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
大小写):
正如您在注释中已经指出的,问题是当迭代器到达
n
时,函数应该终止并说true
。实际上,只要迭代到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
大小写):
你能充实一下你的问题,解释一下你最初如何调用
isPrime
(即iterator
的初始值是多少),并给出一个错误结果的例子吗。此外,您编写的代码如何返回true
?第二种情况应计算为true
,而不是进一步递归。。这就是错误,谢谢你帮我找到它!你能充实一下你的问题,解释一下你最初如何调用isPrime
(即iterator
的初始值是多少),并给出一个错误结果的例子吗。此外,您编写的代码如何返回true
?第二种情况应计算为true
,而不是进一步递归。。这就是错误,谢谢你帮我找到它!你能充实一下你的问题,解释一下你最初如何调用isPrime
(即iterator
的初始值是多少),并给出一个错误结果的例子吗。此外,您编写的代码如何返回true
?第二种情况应计算为true
,而不是进一步递归。。这就是错误,谢谢你帮我找到它!你能充实一下你的问题,解释一下你最初如何调用isPrime
(即iterator
的初始值是多少),并给出一个错误结果的例子吗。此外,您编写的代码如何返回true
?第二种情况应计算为true
,而不是进一步递归。。这就是错误,谢谢你帮我找到它!哦,一个嵌套递归函数,真是天才!我一直在寻找一种在F#中使用可选参数的方法来实现同样的效果,但是嵌套递归要聪明得多!我之所以避免使用if
语句,是因为我读到在F#中使用模式匹配更为惯用,但正如你所知,我对F#完全陌生,所以我可能误读或误解了:)。哦,一个嵌套递归函数,这简直是天才!我一直在寻找一种在F#中使用可选参数的方法来实现同样的效果,但是嵌套递归要聪明得多!我避免使用if
st的原因