我正在尝试实现此算法,但我在第12行遇到语法错误,但我无法确定导致它的原因。我是ocaml的新手,非常感谢任何帮助。
“通过Eratosthenes的方法找到小于或等于给定整数n的所有素数:
创建从2到n的连续整数列表:(2,3,4,...,n)。 最初,让p等于2,即第一个素数。 从p开始,通过以p的增量计数n来枚举其倍数,并在列表中标记它们(这些将是2p,3p,4p,...;不应该标记p本身)。 在列表中找到未标记的第一个大于p的数字。如果没有这样的号码,请停止。否则,让p现在等于这个新数字(这是下一个素数),并从步骤3开始重复。“
let prime(n) =
let arr = Array.create n false in
let set_marks (arr , n , prime ) = Array.set arr (n*prime) true in
for i = 2 to n do
set_marks(arr,i,2) done
let findNextPrimeNumberThatIsNotMarked (arr, prime , index ) =
let nextPrime = Array.get arr index in
let findNextPrimeNumberThatIsNotMarkedHelper (arr, prime, index) =
if nextPrime > prime then nextPrime
else prime in
;;
答案 0 :(得分:2)
加入Jeffrey的回答,
正如我已经在" What exactly is the syntax error here?",
您现在绝对需要做的是安装和使用适当的OCaml缩进工具和自动缩进行。意外的自动缩进结果通常表示遗忘;
等语法错误。如果没有这样的工具,即使有才华的OCaml程序员在没有语法错误的情况下编写OCaml代码也很难。
OCaml有很多自动压头可用:
答案 1 :(得分:1)
OCaml有一个表达式let a = b in c
。您的代码以in
结尾,但c
位于何处?看起来你最后应该删除in
。
仔细观察,我发现有更多问题,抱歉。
OCaml中的一个函数大概如下:
let f x =
let a = b in
let c = d in
val
prime
的定义与此完全相同,只是它以for
循环结束,即使用关键字done
。
其余代码形成第二个独立的函数定义。它的形式如下:
let f x =
let a = b in
let g x = expr in
语法问题是你在in
之后错过了一个表达式。
但是,您使用缩进表示您并未尝试定义两个不同的功能。如果是这样,您需要稍微修改一下代码。
对于命令式样式编程可能有用的一件事是你可以编写expr1; expr2
来一个接一个地计算两个表达式。