Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/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
Recursion 素数检查_Recursion_F#_Functional Programming_Primes_Primality Test - Fatal编程技术网

Recursion 素数检查

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

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

正如您在注释中已经指出的,问题是当迭代器到达
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的原因