Ocaml - 查找列表中的单词数

时间:2016-11-08 15:46:39

标签: ocaml

从列表示例[" 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是主要功能。我没有发现问题! 谢谢你的帮助!

1 个答案:

答案 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的复杂性。我假设这不是主要观点;也就是说,这是一次学习练习。