OCaml - 返回列表的所有前缀的函数

时间:2014-11-06 23:57:01

标签: ocaml

对于[1;2;3],我想返回[[]; [1]; [1; 2]; [1; 2; 3]]。我撞墙了,我需要帮助,这就是我到目前为止所做的事情

let rev list =
let rec aux acc = function
  | [] -> acc
  | h::t -> aux (h::acc) t in
aux [] list;;

let  prefixes xs = 
let xs = rev xs in
let rec xs = function
    |[] -> [[]]
    |hd::tl ->  xs:: tl in
xs ;;`

请帮帮我,我知道到目前为止我做的大部分内容都是错误的。

4 个答案:

答案 0 :(得分:2)

通常要问的问题是如何在给定函数的情况下获取列表的前缀,该函数返回较短列表的所有前缀。

说出您的列表是[1; 2; 3]。较短的列表是[2; 3]。此较短列表的所有前缀均为[][2][2;3]。你怎么能从这个列表中得到你想要的前缀列表?这似乎很直接:你只需要在所有人的前面添加1。另外,您需要添加一个新的空前缀。

作为基本案例,[]的所有前缀列表只是[]。

这似乎是解决问题的可行方法,除了最好的方法是使用List模块中的函数。由于这看起来像家庭作业,我不确定是否允许。

我希望这会有所帮助。

作为旁注,您的rev函数对我来说很好。但您可能不需要它来解决问题。也许您可以编写自己的map函数。

答案 1 :(得分:0)

这是我找到的解决方案。虽然它可能不是最好的,因为我需要在最后反转列表。

let prefix l = List.rev (List.fold_left (fun acc itt -> ((List.hd acc)@[itt])::acc) [[]] l);;

答案 2 :(得分:0)

这个似乎比以前发布的解决方案简单得多。请注意Sublime Text -> Quit Sublime Text不是尾递归。

List.map

答案 3 :(得分:0)

let rec prefixes  = function
       []   -> [[]]
  | x::tl   -> []::List.map (fun li -> x :: li) (prefixes tl);; 

测试:

# prefixes [1];;
- : int list list = [[]; [1]]
# prefixes [1;2];;
- : int list list = [[]; [1]; [1; 2]]
# prefixes [1;2;3];;
- : int list list = [[]; [1]; [1; 2]; [1; 2; 3]]