【问题标题】:Is there a better solution?有更好的解决方案吗?
【发布时间】:2021-02-12 23:44:24
【问题描述】:

我正在制作一个函数,它返回给定数字在 int 列表中出现的次数。我有一个解决方案,但我觉得它相当初级,可以做得更好(也许用 match 和 rec??)。我也觉得样式不对,但还不太清楚如何设置 OCaml 样式。

代码如下:

let num_occurs (n : int) (nums : int list) : int =
  let x = List.fold_left (+) 0 
  (List.filter (fun (x : int) -> 
  if x = n then true else false) nums) in 
  x / n ;;

【问题讨论】:

  • 我发现我的解决方案存在潜在问题。如果用户输入 0 作为要计数的 int,这将不起作用。我将继续研究使用匹配的解决方案。
  • 为什么最后要申请x/n?似乎您是在将计数除以数字本身...
  • 不管怎样,正确的做法可能就是 List.length (List.filter (fun x -> x = n) nums) ——或者类似的东西,我懒得拉开终端检查语法是否正确
  • 啊,有道理,是的。我明白你现在在想什么,这是合理的,但可以简化:)
  • 简短评论:if x = n then true else false 就是 x = n,因为这将返回 truefalse

标签: ocaml higher-order-functions


【解决方案1】:

所以你的东西看起来不错,虽然我不确定x / n 打算做什么。使用 List.fold_left 和 List.filter 对于 OCaml 来说是一个很好的直觉。不过,为了让它更简洁,只需使用 List.length!作为奖励,您可以直接使用 x = n 而不是if then else

let num_occurs (n : int) (nums : int list) : int =
  List.length (List.filter (fun x -> x = n) nums)

【讨论】:

猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 2020-03-08
相关资源
最近更新 更多