我是一名学生,而且我已经接受过锻炼,我已经挣扎了大约一个月左右。 我正在尝试在Ocaml中编写一个函数。此函数必须读取每行包含单词的文本文件,并且必须将所有单词存储在列表中。 但问题是这个程序必须是递归的(这意味着没有循环,没有“while”)。
我迄今为止所做的就是创建一个读取文本文件的函数(非常类似于BASH命令“cat”)
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() ;;
我只是不知道该怎么做。 Ocaml不是我最喜欢的语言。
答案 0 :(得分:2)
这里是尾部递归的build_list
的替代定义。如果您的输入可以包含多行,则可以使用它而不是@ MitchellGouzenko的定义。
let rec build_list l =
match input_line ic with
| line -> build_list (line :: l)
| exception End_of_file -> close_in ic; List.rev l
答案 1 :(得分:0)
open Printf
let file = "example.dat"
let () =
let ic = open_in file in
let rec build_list infile =
try
let line = input_line infile in
line :: build_list(infile)
with End_of_file ->
close_in infile;
[] in
let rec print_list = function
[] -> ()
| e::l -> print_string e ; print_string " " ; print_list l in
print_list(build_list(ic))
编辑:我之前提出的算法不必要地复杂化。试着去理解这个。
要理解这种递归,我们假设build_list正常工作。也就是说,假设build_list正确地将打开的文件作为参数,并返回文件中的行列表。
现在,让我们看看函数的主体。它从文件中读取一行并再次调用build_list。如果文件中有N行,则再次调用build_list应该返回文件中剩余N-1行的列表(因为我们自己只读了第一行)。我们将刚刚读取的行追加到build_list返回的列表中,并返回结果列表,其中包含所有N行。
递归继续,直到它遇到基本情况。基本情况是有End_of_file时。在这种情况下,我们返回一个空列表。