Ich bin Student und habe eine Übung erhalten, mit der ich seit ungefähr einem Monat zu kämpfen habe. Ich versuche eine Funktion in Ocaml zu schreiben. Diese Funktion muss eine Textdatei lesen, die ein Wort pro Zeile enthält, und sie muss alle Wörter in einer Liste speichern. Aber das Problem ist, dass dieses Programm eine rekursive sein muss (was bedeutet, keine Schleifen, keine "während").Eine Dateizeile pro Zeile lesen und jede gelesene Zeile in einer einzigen Liste speichern
Alles, was ich habe in der Lage gewesen, so weit zu tun ist, um eine Funktion zu erstellen, die die Textdatei (ziemlich ähnlich wie der BASH Befehl „cat“) Ich weiß es einfach nicht
let dico filename =
let f = open_in filename in
let rec dico_rec() =
try
print_string (input_line f);
print_newline();
dico_rec();
with End_of_file -> close_in f
in dico_rec() ;;
liest, wie man TU es. Ocaml ist kaum meine Lieblingssprache.
Dies funktioniert für kleine Eingabedateien, aber diese Definition von 'build_list' ist nicht tail rekursiv und verursacht einen Stapelüberlauf für große Eingaben. Der "try ... with", der den rekursiven Aufruf umgibt, verhindert, dass es ein Tail-Call ist. –
Guter Ruf ... war eine Weile her, seit ich ocaml benutzt habe :) Denkst du, dass die neue 'build_list' besser ist, oder die alte' (was beinhaltet, dass eine leere Liste als Argument übergeben wird)? Angenommen natürlich, dass ich das 'try ... with' Bit repariere. –
Ich erröte, dies zu OP zuzulassen, der anscheinend kein OCaml-Fan ist, aber man muss lernen, Tail-Calls zu erkennen, wenn man OCaml-Code schreibt. "Versuch ... mit" ist einer der schwierigsten Fälle. –