Ocaml-查找列表中的字数

Ocaml-查找列表中的字数,ocaml,Ocaml,从一个列表示例[“狗”;“猫”;“狗”;“猫”;“狗”]中,我必须找到一个单词在这个列表中出现的时间 结果->[(“狗”,3);(“猫”,2)] 但我得到了一个奇怪的结果:[(“狗”,1);(“猫”,1);(“狗”,2);(“猫”,2);(“狗”,3)] 我的代码是: let rec nuovaParola par l = match l with [] -> true |(a,_)::z ->if (par=a) then false else n

从一个列表示例[“狗”;“猫”;“狗”;“猫”;“狗”]中,我必须找到一个单词在这个列表中出现的时间 结果->[(“狗”,3);(“猫”,2)] 但我得到了一个奇怪的结果:[(“狗”,1);(“猫”,1);(“狗”,2);(“猫”,2);(“狗”,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会给我true,否则会给我false

contaParola使用(“单词”,数字)重新返回元组

Occorrenze是主要功能。我没发现问题!
谢谢你的帮助

事实上,您的问题与前面提到的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
,而是创建一个根据需要修改的新列表

这与您的问题类似,只是您要查找与单词匹配的元素,而不是奇数


作为旁白,使用列表存储计数并不是一个特别可扩展的解决方案。如果您的输入列表可能很大,那么最好使用具有logn复杂性的内容,例如映射。通过一个列表,你得到了线性复杂度,所以你得到了n^2的总体复杂度。我想这不是重点;i、 例如,这是一个学习练习。

事实上,您的问题与前面提到的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
,而是创建一个根据需要修改的新列表

这与您的问题类似,只是您要查找与单词匹配的元素,而不是奇数

作为旁白,使用列表存储计数并不是一个特别可扩展的解决方案。如果您的输入列表可能很大,那么最好使用具有logn复杂性的内容,例如映射。通过一个列表,你得到了线性复杂度,所以你得到了n^2的总体复杂度。我想这不是重点;i、 例如,这是一个学习练习。

可能的重复