对于[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 ;;`
请帮帮我,我知道到目前为止我做的大部分内容都是错误的。
答案 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]]