试图在OCaml中创建递归函数

时间:2017-11-12 07:03:26

标签: syntax-error ocaml

所以我有这个while循环概念,我想转换成OCaml递归:

伪代码:

n = read integer from stdin
m = 1
while m*(m+1)/2 < n
    m = m + 1
print m

我在OCaml的尝试:

let n = int_of_string (input_line stdin) in

let rec get_ans m n =
    if m*(m+1)/2 < n then get_ans (m + 1) n else m;;

print_endline get_ans 1 n;

但是我刚刚得到&#34;语法错误&#34;在长功能线上没有任何关于我做错的细节。

1 个答案:

答案 0 :(得分:0)

您无法使用in链接到顶级声明。您在;;而不是in收到错误的原因是它希望;;in <valid expression>。你也有一些丢失或多余的括号问题。删除第一个in将起作用:

let n = int_of_string (input_line stdin);;

let rec get_ans m n =
    if m*(m+1)/2 < n then get_ans (m + 1) n else m;;

print_endline (string_of_int (get_ans 1 n));

或者,在第二次let绑定之后使用in也会使它成为有效的表达式:

let n = int_of_string (input_line stdin) in
let rec get_ans m n =
  if m*(m+1)/2 < n then get_ans (m + 1) n else m in

print_endline (string_of_int (get_ans 1 n))

但在这种情况下,推断出前导let () =使其成为有效的顶级声明。