[英]OCaml - implement a histogram function
我有一个正在处理的项目,我需要在OCaml中实现直方图功能。 我必须编写一个将列表作为参数并以元组列表的形式返回直方图的函数。 它看起来像这样:
histogram [1;2;3;1;1;3];;
[(1,3);(2,1);(3,2)]
但是,我无法使它正常工作。 我觉得我已经很接近了,但是我只需要一些有关如何完成实际直方图功能的帮助/指导。 到目前为止,我已经使它检查了列表(nl)中可能已经存在的所有内容。 如果它不包含数字,我将其添加到列表中。 我的问题是,一旦将其添加到列表中,我将不知道如何调用该函数。 请参阅我的代码以找出问题所在。
let check a ls = match (a,ls) with
|a,[] -> false
|a,xs -> if fst (hd xs) != a then check a (tl xs) else true
let rec count a ls = match ls with
|[] -> 0
|x::xs -> if x = a then 1 + count a xs else 0 + count a xs
let nl = []
let rec histo l = match l with
|[]-> []
|x::xs -> if check x nl then histo xs else nl @ [(x,count x l)] *******
我需要重新调用histo ******所在的位置。 任何帮助将不胜感激。
显然,这是一项学校作业,因此我仅给出一些提示。
您似乎希望在histo
函数中修改nl
。 但是OCaml变量是不可变的。 代码中名为nl
的变量将始终绑定到一个空列表。 通常,这是FP中首先要弄清楚的事情:如何使用不可变值。
提示,本质是将像nl
这样的值作为函数的参数传递。 当然,在对函数的不同调用中,函数的参数可以不同。
当x
在nl
出现时,我不遵循您的代码( check
返回true)。 在这种情况下,您需要创建一个计数递增的列表。 但是您的代码只是继续执行而没有做任何特别的事情。
如果您将histo
重新定义为采用所有必需的参数,则未完成的案例只需要使用正确的参数调用histo
。
toastedDeli,关于功能计数的一些建议。 您可以使用更多模式匹配:
let rec count a ls = match ls with
|[] -> 0
|x::xs when x=a -> 1 + count a xs
|_::xs -> count a xs
let rec count a = function
|[] -> 0
|x::xs when x=a -> 1 + count a xs
|_::xs -> count a xs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.