从列表示例[" dog";" cat";" dog";" cat&#34 ;;" dog&# 34;]我必须找到一个单词在此列表中产生的时间 结果 - > [("狗",3);("猫",2)] 但是我得到了一个奇怪的结果:[(" dog",1); (" cat",1); (" dog",2); (" cat",2); (" dog",3)]
我的代码是:
let rec nuovaParola par l =
match l with
[] -> true
|(a,_)::z ->if (par=a) then false
else nuovaParola par (List.tl l);;
let rec contaParole par l =
let rec contatore par l cont =
match l with
[] -> (par, cont)
|x::y -> if(par=x) then contatore par y (cont+1)
else contatore par y cont
in contatore par l 0;;
let rec occorrenze l =
let rec aux l l1=
match l with
[] -> l1
|x::y -> if (nuovaParola x l1) then aux y l1@[(contaParole x l)]
else aux y l1
in aux l [];;`
nuovaParola如果这个词不在列表中,那么我就是真的,否则就会给我错误。
contaParola用(" word",number)恢复元组;
Occorrenze是主要功能。我没有发现问题! 谢谢你的帮助!
答案 0 :(得分:1)
实际上,您遇到的问题与之前引用的StackOverflow页面相同。您将为找到的每个单词向输出添加新元素。这不起作用,因为您希望每个唯一单词的输出中只有一个元素。
实质上,您需要更新列表中的现有条目,而不是添加新条目。
但是,OCaml中的列表是不可变的。您无法实际更新列表,只能创建具有所需内容的新列表。
这是一个更新非负内联列表的函数:它将每个元素舍入到下一个偶数。
let rec upeven l =
match l with
| [] -> []
| h :: t ->
let h' = if h mod 2 = 1 then h + 1 else h in
h' :: upeven t
关键是此函数不会修改列表l
,它会创建一个根据需要修改的新列表。
这与您的问题类似,不同之处在于您正在寻找与您的单词匹配的元素,而不是奇数。
作为旁注,使用列表存储您的计数并不是一个特别可扩展的解决方案。如果您的输入列表可能很大,那么最好使用具有log n复杂性的内容,例如Map。使用列表可以获得线性复杂度,因此总体上会得到n ^ 2的复杂性。我假设这不是主要观点;也就是说,这是一次学习练习。