如何在没有递归 ocaml 的情况下展平列表?
How to flatten a list without recursion ocaml?
如何在 ocaml 中将整数列表的列表展平为单个整数列表?该函数将如下所示工作。
[[1;2];[3;4;5];[];[6]] -> [1;2;3;4;5;6]
由于是作业,必须只用fold_left或fold_right完成,不能使用'@'运算符,不能使用递归。我知道累加器将成为新列表的成员,但我不知道如何将原始列表的元素实际移动到累加器。任何提示将不胜感激。
这里有一些提示:
一个。将值移动到累加器并不困难。如果你的值是x
,你的累加器是a
,你可以只写x :: a
.
b。您主要需要以一致的顺序处理所有内部值。这就是折叠的目的。
c。折叠用于处理列表的元素。但是你有一个列表列表。
List.fold_left (fun liRes la ->
List.fold_right ( fun iRes la ->
iRes::la
) liRes la
) [] [[1;2];[3;4;5];[];[6]]
结果:
- : int list = [1; 2; 3; 4; 5; 6]
其他形式:
let (@) =
List.fold_right ( fun iRes la ->
iRes::la
);;
List.fold_left (fun liRes la ->
liRes @ la
) [] [[1;2];[3;4;5];[];[6]];;
你可以试试:
# []@[1;2];;
- : int list = [1; 2]
# (@) [1;2] [3;4];;
- : int list = [1; 2; 3; 4]
如何在 ocaml 中将整数列表的列表展平为单个整数列表?该函数将如下所示工作。
[[1;2];[3;4;5];[];[6]] -> [1;2;3;4;5;6]
由于是作业,必须只用fold_left或fold_right完成,不能使用'@'运算符,不能使用递归。我知道累加器将成为新列表的成员,但我不知道如何将原始列表的元素实际移动到累加器。任何提示将不胜感激。
这里有一些提示:
一个。将值移动到累加器并不困难。如果你的值是x
,你的累加器是a
,你可以只写x :: a
.
b。您主要需要以一致的顺序处理所有内部值。这就是折叠的目的。
c。折叠用于处理列表的元素。但是你有一个列表列表。
List.fold_left (fun liRes la ->
List.fold_right ( fun iRes la ->
iRes::la
) liRes la
) [] [[1;2];[3;4;5];[];[6]]
结果:
- : int list = [1; 2; 3; 4; 5; 6]
其他形式:
let (@) =
List.fold_right ( fun iRes la ->
iRes::la
);;
List.fold_left (fun liRes la ->
liRes @ la
) [] [[1;2];[3;4;5];[];[6]];;
你可以试试:
# []@[1;2];;
- : int list = [1; 2]
# (@) [1;2] [3;4];;
- : int list = [1; 2; 3; 4]