Ocaml-查找列表中的字数
从一个列表示例[“狗”;“猫”;“狗”;“猫”;“狗”]中,我必须找到一个单词在这个列表中出现的时间 结果->[(“狗”,3);(“猫”,2)] 但我得到了一个奇怪的结果:[(“狗”,1);(“猫”,1);(“狗”,2);(“猫”,2);(“狗”,3)] 我的代码是: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
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、 例如,这是一个学习练习。可能的重复