2016-09-30 139 views
1

这是一项家庭作业。 OCaml似乎是由精神病患者做出的。制作isPrime函数时遇到问题

let prime : int -> bool 
= fun n -> 
    if n > 2 then 
     let a = n - 1 in 
     let rec divisor n a = 
      if a > 1 && n mod a = 0 then false 
     else if a = 2 && n mod a <> 0 then true 
     else divisor n a-1 ;; 
    else if n = 2 then true 
    else if n = 1 then false 

我在编码不好的,我知道我的isPrime算法是错误的。 但我想知道在我的代码中哪里是产生语法错误的错误。

还有什么办法可以在递归形式中定义isPrime函数吗?

例子:

let rec prime n = ~

+0

总是在二元运算符周围放置空格:'f n-1'太容易误读为'f(n-1)'并且很难找到您的错误。通过写'f n - 1',你有更多的机会注意到它实际上被解析为'(f n) - 1'。 – camlspotter

回答

4

你会得到专家的更好的反应,如果你不无偿侮辱他们的语言:-)但我是一个随和的人,所以我会花刺在你的语法错误。

此代码中存在相当多的问题。这里有3个,我看马上:

  1. 符号;;用来告诉您输入您希望它评估的充分体现解释。它在函数声明的中间绝对不合适。

  2. 您的第二个let没有关联in。之后每let必须有一个in。唯一的例外是在模块顶层定义值(例如prime函数)。

  3. 表达式divisor n a-1被解析为(divisor n a) - 1。你想要这样的括号:divisor a (n - 1)

+0

杰弗里的另一个问题是,素数不包括所有的情况,特别是n = 0。也主要生产两种类型的单位和整数。 –