如何创建一个反转OCaml中的int列表的函数?

时间:2018-05-08 19:30:19

标签: functional-programming ocaml

我有一个intlist类型:

type intlist = Nil | Cons of int * intlist

我现在想编写一个反转列表的函数。我真的不知道如何解决这个问题。在课堂上,我的教授在一个函数中定义了一个函数,我相信,但我没有解决方案。一个人怎么会这样做,干脆?如果我们能够保持编码相当简陋,我会很感激,因为我对此比较陌生。

到目前为止,我只有

let reverse (l:intlist):intlist = 
match l with
Nil -> Nil
|Cons(a, Nil) -> Cons(a,Nil)

这就是我倾向于创建这些函数的方式,所以我写了一些琐碎的部分(授予,实际上可能不是我需要的开头)。感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

你确实需要一个辅助函数,因为对于逆转你需要构建另一个列表,所以你需要一个函数来递归到一个列表,同时构建另一个列表,即有两个参数。事实上,这个辅助函数被称为rev_append,它将一个列表的反转内容附加到另一个列表。但是让我们尝试使用在rev函数范围内定义的辅助函数来实现它:

 let rev xs =
   let rec loop xs ys = match xs with
     | Nil -> ys
     | Cons (x,xs) -> loop xs (Cons (x,ys)) in
   loop xs Nil

因此,要反转列表,我们只需获取列表中的每个元素并将其放入另一个列表中。由于列表的行为类似于堆栈,因此我们可以免费获得反向列表。它就像河内塔,当你从一个列表(塔)中挑选元素并将它们放到另一个列表中时,它们将以相反的顺序结束。