2017-11-12 10 views
0

だから、私はOCamlの再帰に変換したいのですが、このwhileループの概念があります。OCamlの中で再帰関数をしようとして

擬似コード:

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

OCamlでの私の試み:

しかし、私は間違って何をしているのかについて詳細な説明がなくても、長い機能行に「構文エラー」が表示されています。

答えて

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を初めて使っているので、二重引用符を完全に理解していません。物事とすべてのこと - 私は守らなければならない? – user8926565

+0

また、最初の例は2つの ';;'ではなく、 ';'で終わるのはなぜですか? – user8926565

+0

あなたが周りを遊んでいるのであれば、どちらのフォームも問題ありません。実際のプロジェクトでは、stdinからグローバル変数に読み込むべきではないでしょう。 'print_endline ...'の中でlet()= let n = ...で 'main'関数の種類を定義し、' get_ans'関数をトップレベルの宣言として保つのが普通です – glennsl

関連する問題