2017-11-12 1 views
0

그래서 나는 내가 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; 

그러나 내가 잘못하고있는 것에 대한 자세한 내용없이 긴 함수 줄에는 "구문 오류"가 나타납니다.

답변

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)); 

: : 첫 번째 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() =는 만들 추정됩니다 그것은 유효한 최상위 선언입니다.

+0

두 가지 방법 중 어느 것이 바람직한 방법입니까? 나는 OCaml을 처음 접했으므로 이중 언어를 완전히 이해하지 못했다; in-thing과 모든 것 - 나는 어느 것을 고집해야합니까? – user8926565

+0

첫 번째 예제가 두 개의';;'와 반대로 하나의'; '로 끝나는 이유는 무엇입니까? – user8926565

+0

방금 ​​놀고 있다면 두 형식 모두 괜찮습니다. 실제 프로젝트에서는 stdin을 전역 변수로 읽지 않아야합니다. 'print_endline ... '에서'let() = let n = ... in'을 사용하여 일종의'main' 함수를 정의하지만'get_ans' 함수를 최상위 선언으로 유지하는 것은 통상적입니다 – glennsl

관련 문제