制作isPrime函数时遇到问题
问题描述:
这是一项家庭作业。 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 = ~
答
你会得到专家的更好的反应,如果你不无偿侮辱他们的语言:-)但我是一个随和的人,所以我会花刺在你的语法错误。
此代码中存在相当多的问题。这里有3个,我看马上:
符号
;;
用来告诉您输入您希望它评估的充分体现解释。它在函数声明的中间绝对不合适。您的第二个
let
没有关联in
。之后每let
必须有一个in
。唯一的例外是在模块顶层定义值(例如prime
函数)。表达式
divisor n a-1
被解析为(divisor n a) - 1
。你想要这样的括号:divisor a (n - 1)
。
+0
杰弗里的另一个问题是,素数不包括所有的情况,特别是n = 0。也主要生产两种类型的单位和整数。 –
总是在二元运算符周围放置空格:'f n-1'太容易误读为'f(n-1)'并且很难找到您的错误。通过写'f n - 1',你有更多的机会注意到它实际上被解析为'(f n) - 1'。 – camlspotter