Recursion OCaml-实现直方图函数

Recursion OCaml-实现直方图函数,recursion,ocaml,histogram,Recursion,Ocaml,Histogram,我有一个项目,我正在工作,我需要实现一个直方图功能在OCaml。我必须编写一个函数,将列表作为参数,并以元组列表的形式返回直方图。它看起来像这样: histogram [1;2;3;1;1;3];; [(1,3);(2,1);(3,2)] 然而,我无法让它工作。我觉得我已经很接近了,但我只是需要一些帮助/指导来完成实际的直方图功能。到目前为止,我已经做了检查清单(nl)的任何可能已经在那里。如果它还没有包含号码,我会把它添加到列表中。我的问题是,一旦我将函数添加到列表中,我就不知道如何调用它。

我有一个项目,我正在工作,我需要实现一个直方图功能在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
    之类的值作为函数的参数传递。当然,在对函数的不同调用中,函数的参数可能不同

  • nl
    中出现
    x
    时,我不遵循您的代码(
    check
    返回true)。在这种情况下,您需要创建一个计数递增的列表。但是你的代码只是继续,没有做任何特别的事情

  • 如果重新定义
    histo
    以获取所有必需的参数,则未完成的案例只需使用正确的参数调用
    histo


    • 这显然是一项学校作业,所以我只想给出一些提示

      • 您似乎希望在
        histo
        函数中修改
        nl
        。但是OCaml变量是不可变的。代码中名为
        nl
        的变量将始终绑定到空列表。这通常是FP中首先要解决的问题:如何处理不可变值

      • 作为提示,其本质是将
        nl
        之类的值作为函数的参数传递。当然,在对函数的不同调用中,函数的参数可能不同

      • nl
        中出现
        x
        时,我不遵循您的代码(
        check
        返回true)。在这种情况下,您需要创建一个计数递增的列表。但是你的代码只是继续,没有做任何特别的事情

      • 如果重新定义
        histo
        以获取所有必需的参数,则未完成的案例只需使用正确的参数调用
        histo


      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
      

      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