我正在为ocaml中的Harvard CS 51编程课程解决编程方面的问题.问题是定义一个函数,它可以将字符列表压缩为对列表,其中每对包含列表中字符和字符本身的许多后续发生,即在将此函数应用于列表['a'之后;'a';'a';'a';'a';'b';'b';'b';'c';'d';'d';'d';'d']我们应该得到[(5,'a');(3,'b');(1,'c');(4,'d')]的列表.我想出了使用辅助功能的功能去解决这个问题:
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
| [] -> []
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否可以使用嵌套模式匹配定义递归函数to_run_length,而无需定义辅助函数go.在这种情况下,我们如何存储已传递元素的计数器状态?