【问题标题】:Prime number check质数检查
【发布时间】:2014-12-29 08:21:18
【问题描述】:

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

【问题讨论】:

  • 您能否充实您的问题以解释您最初如何调用isPrime(即iterator 的初始值是什么),并举例说明它给出的错误结果。另外,你写的代码怎么会返回true
  • 第二种情况应该评估为true,而不是进一步递归。这是错误,感谢帮助我找到它!

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


【解决方案1】:

正如您在 cmets 中已经发现的那样,问题是当迭代器到达 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案例):

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

【讨论】:

  • 哦,一个嵌套的递归函数,真是天才!我一直在寻找一种在 F# 中执行可选参数以实现相同目的的方法,但是嵌套递归要聪明得多!我避免使用if 语句的原因是,我读到在 F# 中使用模式匹配更为惯用,但正如您所见,我对 F# 完全陌生,所以我可能误读或误解了 :) .
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
相关资源
最近更新 更多