【问题标题】:OCaml - implement a histogram functionOCaml - 实现一个直方图函数
【发布时间】:2015-10-31 02:26:06
【问题描述】:

我有一个正在做的项目,我需要在 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)] *******

我需要重新调用 ****** 在哪里。任何帮助都将不胜感激。

【问题讨论】:

    标签: recursion ocaml histogram


    【解决方案1】:

    这显然是一个学校作业,所以我只是给出一些提示。

    • 您似乎希望在您的 histo 函数中修改 nl。但是 OCaml 变量是不可变的。代码中名为nl 的变量将始终绑定到一个空列表。这通常是 FP 中首先要弄清楚的:如何使用不可变值。

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

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

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

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多