我正在解决 ocaml 中哈佛 CS 51 编程课程的编程课程。问题是定义一个函数,该函数可以将字符列表压缩为对列表,其中每对包含列表中字符和字符本身的许多后续出现,即在将此函数应用于列表 ['a' ;'a';'a';'a';'a';'b';'b';'b';'c';'d';'d';'d';'d'] 我们应该得到 [(5,'a');(3,'b');(1,'c');(4,'d')] 的列表。我想出了使用辅助函数 go 来解决这个问题的函数:
let to_run_length (lst : char list) : (int*char) list =
let rec go i s lst1 =
match lst1 with
| [] -> [(i,s)]
| (x::xs) when s <> x -> (i,s) :: go 0 x lst1
| (x::xs) -> go (i + 1) s xs
in match lst with
| x :: xs -> go 0 x lst
| [] -> []
我的问题是:是否可以在不定义辅助函数 go 的情况下使用嵌套模式匹配定义递归函数 to_run_length。在这种情况下,我们如何存储已通过元素的计数器状态?