所以我有这个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;在长功能线上没有任何关于我做错的细节。
答案 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 () =
使其成为有效的顶级声明。