我正在尝试编写一个接收列表的函数,并返回列表中连续重复元素的数量。
例如,给定[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)
答案 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)