如何计算Ocaml中连续重复的数量

时间:2017-06-17 22:35:35

标签: ocaml

我正在尝试编写一个接收列表的函数,并返回列表中连续重复元素的数量。

例如,给定[1;2;3;3;4;4;5],函数应返回2

这是我的初始实现,但不幸的是它总是返回0。我不太确定这个bug在哪里。 任何有关如何改进它的帮助将受到高度赞赏。

let rec count_successive_duplicates (lst: int list) (count: int) : (int) =
  match lst with
    | [] | [_]-> 0
    | x :: y :: tl ->
      if x = y then count_successive_duplicates (y::tl) (count + 1) else count_successive_duplicates (y::tl) count
  ;;

let () =
  print_int (count_successive_duplicates [1;2;3;3;4;4;5] 0)

2 个答案:

答案 0 :(得分:1)

最后,您将要使用计数而不是0始终返回累加器:

let rec count_successive_duplicates (lst: int list) (count: int) : (int) =
  match lst with
    | [] | [_] -> count
(*                ^^^^^ */)
    | x :: y :: tl -> count_successive_duplicates (y::tl) (count + if x = y then 1 else 0)

答案 1 :(得分:0)

似乎我总是为基本案例返回0而不是计算的计数。之前的版本只是忽略了它收到的计算count。这现在有效:

let rec count_successive_duplicates lst count : (int) = match lst with
  | [] | [_]-> count
  | x :: y :: tl ->
    if x = y then count_successive_duplicates (y::tl) (count + 1) else count_successive_duplicates (y::tl) count
;;

let () =
  print_int (count_successive_duplicates [1;2;3;3;4;4;5] 0)