2017-11-12 1 views
0

So habe ich diese while-Schleife Konzept, dass ich in eine OCaml Rekursion übersetzen möchten:Der Versuch, eine rekursive Funktion in OCaml zu machen

Pseudocode:

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

Mein Versuch in 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; 

Allerdings bekomme ich nur "Syntaxfehler" auf der langen Funktionszeile ohne jedes Detail, was ich falsch mache.

Antwort

0

Sie können in nicht verwenden, um Toplevel-Deklarationen zu verknüpfen. Der Grund, warum Sie einen Fehler bei ;; anstelle von in erhalten, ist, dass es ;;in <valid expression> erwartet. Sie haben auch einige Probleme mit fehlenden oder überflüssigen Klammern. Entfernen des ersten in funktionieren würde:

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

Alternativ mit in nach dem zweiten let-Bindung als auch würde es einen gültigen Ausdruck machen:

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

Aber in diesem Fall ein führender let() = wird gefolgert zu machen es ist eine gültige Toplevel-Deklaration.

+0

Welcher der beiden ist der bevorzugte Ansatz? Ich bin neu in OCaml und verstehe daher nicht ganz das Doppelte ;; gegen das In-Ding und all das - womit sollte ich bleiben? – user8926565

+0

Auch warum endet das erste Beispiel in einem ';' im Gegensatz zu zwei ';;'? – user8926565

+0

Beide Formen sind in Ordnung, wenn Sie nur herumspielen. In einem realen Weltprojekt sollte man jedoch wahrscheinlich nicht von stdin in eine globale Variable hineinlesen. Es ist dann üblich, eine Art 'main'-Funktion mit' let() = let n = ... in print_endline ... 'zu definieren, aber die' get_ans'-Funktion als Deklaration der obersten Ebene zu behalten – glennsl

Verwandte Themen