Recursion OCaml-实现直方图函数
我有一个项目,我正在工作,我需要实现一个直方图功能在OCaml。我必须编写一个函数,将列表作为参数,并以元组列表的形式返回直方图。它看起来像这样:Recursion OCaml-实现直方图函数,recursion,ocaml,histogram,Recursion,Ocaml,Histogram,我有一个项目,我正在工作,我需要实现一个直方图功能在OCaml。我必须编写一个函数,将列表作为参数,并以元组列表的形式返回直方图。它看起来像这样: histogram [1;2;3;1;1;3];; [(1,3);(2,1);(3,2)] 然而,我无法让它工作。我觉得我已经很接近了,但我只是需要一些帮助/指导来完成实际的直方图功能。到目前为止,我已经做了检查清单(nl)的任何可能已经在那里。如果它还没有包含号码,我会把它添加到列表中。我的问题是,一旦我将函数添加到列表中,我就不知道如何调用它。
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
。但是OCaml变量是不可变的。代码中名为nl
的变量将始终绑定到空列表。这通常是FP中首先要解决的问题:如何处理不可变值nl
- 作为提示,其本质是将
之类的值作为函数的参数传递。当然,在对函数的不同调用中,函数的参数可能不同nl
- 当
中出现nl
时,我不遵循您的代码(x
返回true)。在这种情况下,您需要创建一个计数递增的列表。但是你的代码只是继续,没有做任何特别的事情check
- 如果重新定义
以获取所有必需的参数,则未完成的案例只需使用正确的参数调用histo
histo
- 您似乎希望在
函数中修改histo
。但是OCaml变量是不可变的。代码中名为nl
的变量将始终绑定到空列表。这通常是FP中首先要解决的问题:如何处理不可变值nl
- 作为提示,其本质是将
之类的值作为函数的参数传递。当然,在对函数的不同调用中,函数的参数可能不同nl
- 当
中出现nl
时,我不遵循您的代码(x
返回true)。在这种情况下,您需要创建一个计数递增的列表。但是你的代码只是继续,没有做任何特别的事情check
- 如果重新定义
以获取所有必需的参数,则未完成的案例只需使用正确的参数调用histo
histo
- 这显然是一项学校作业,所以我只想给出一些提示
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
Toastedeli,关于函数计数的一点建议。您可以使用更多模式匹配:
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