这是我对问题的想法,但是我无法正确键入fold_left
方法。
示例:
nonDecreasing[1;4;3;2;5;6] == [[1;4];[3];[2;5;6]]
let nonDecreasing list =
match list with
| [] -> help(a, b, c) = b
| h::[] -> 2 (*I don't know, "2" is only to compile*)
| h::t -> let help = List.fold_left (fun(prev, lFinal, lTemp) h -> if(h<List.hd(t)) then (List.hd(t), lFinal, h::lTemp) else (List.hd(t), lTemp@lFinal, h::lTemp)) (h, [], []) list ;;
I can't make it properly. I don't know what I do wrong with fold-left function.
答案 0 :(得分:0)
要使用折叠构建列表,使用fold_right
可能会更容易,因为您只能高效地将元素添加到列表中,因此您应该从右侧开始构建列表,{{1 }}。 (您也可以使用fold_right
,但随后需要在另一个步骤中反转列表或使用昂贵的列表串联。)
使用fold_left
构建列表的一个更简单的示例是,从列表的末尾开始构建列表元素之和的列表,例如fold_right
给出{{1} }。代码如下。
sums [a; b; c]
内部函数的作用是获取已构建列表的第一个元素,并将其添加到当前元素中。 (请记住,元素是从右到左访问的。)然后将总和添加到已存在列表的前面。
定义[a+b+c; b+c; c]
函数的方式与此类似。但是,我们必须使用嵌套列表,这会使事情变得更加复杂。代码如下。
let sums = List.fold_right
(fun x ys ->
match ys with
| [] -> [x]
| hd :: tl -> (x + hd) :: ys)
[1; 2; 3; 4; 5]
[]
同样,我们从右到左构建列表,但是这次我们必须决定将两个元素添加到两个列表中的哪一个。我们可以将其添加到外部列表的开头,也可以将仅包含当前元素的新列表添加到外部列表的开头。