Sorting 将元素插入升序列表[ocaml]

Sorting 将元素插入升序列表[ocaml],sorting,ocaml,Sorting,Ocaml,下面的代码将一个元素插入到按升序排序的列表中 let rec insert x l = match l with | [] -> [x] | y::ys -> if x < y then x::y::ys else y::insert x ys 让rec插入x l= 匹配 |[]->[x] |y::ys->如果xif then a::x::b else a::b)l[] 每次调用函数时,它都会看到最终列表的末尾,以及通常位于列表前面的新元素。似乎可以根据

下面的代码将一个元素插入到按升序排序的列表中

let rec insert x l =
  match l with
    | [] -> [x]
    | y::ys -> if x < y then x::y::ys else y::insert x ys
让rec插入x l=
匹配
|[]->[x]
|y::ys->如果x

但是,如何仅使用List.fold\u right实现上述函数,而不使用递归?

请查看
List.fold\u right
的最简单实现:

let rec fold_right f li init = match li with
  | [] -> init
  | y::ys -> f y (fold_right f ys init)
你可以试试类似的东西

let insert x li =
  let add_x y inserted_ys =
    if x < y then x::y::inserted_ys
    else y::inserted_ys
  in
  List.fold_right add_x li [x]

请注意,这是一种编写
insert
的复杂方法。更好的方法是让
add\ux
返回一对列表和一个布尔值,布尔值告诉您是否已经添加了
x

查看
列表的最简单实现。向右折叠

let rec fold_right f li init = match li with
  | [] -> init
  | y::ys -> f y (fold_right f ys init)
你可以试试类似的东西

let insert x li =
  let add_x y inserted_ys =
    if x < y then x::y::inserted_ys
    else y::inserted_ys
  in
  List.fold_right add_x li [x]

请注意,这是一种编写
insert
的复杂方法。更好的方法是让
add_x
返回一对列表和一个布尔值,布尔值告诉您是否已经添加了
x

我可以想象解决方案是这样的:

fun insert x l =
    List.fold_right (fun a b -> if <test> then a :: x :: b else a :: b) l []
fun insert x l=
List.fold_right(fun a b->if then a::x::b else a::b)l[]
每次调用函数时,它都会看到最终列表的末尾,以及通常位于列表前面的新元素。似乎可以根据此信息决定是否在当前位置插入值
x

此方案的简单实现将在结果中多次插入x。但在我看来,如果你把
做得足够具体,它就会起作用

当x位于列表开头时,此方案也不起作用。你必须单独处理那件事


正如gasche所说,这并不是构建升序列表的有效方法。(FWIW gasche是一位比我更为知名的OCaml专家:-)

我可以想象解决方案的方案是这样的:

fun insert x l =
    List.fold_right (fun a b -> if <test> then a :: x :: b else a :: b) l []
fun insert x l=
List.fold_right(fun a b->if then a::x::b else a::b)l[]
每次调用函数时,它都会看到最终列表的末尾,以及通常位于列表前面的新元素。似乎可以根据此信息决定是否在当前位置插入值
x

此方案的简单实现将在结果中多次插入x。但在我看来,如果你把
做得足够具体,它就会起作用

当x位于列表开头时,此方案也不起作用。你必须单独处理那件事


正如gasche所说,这并不是构建升序列表的有效方法。(FWIW gasche是一位远比我更为知名的OCaml专家:-)

折叠(fold\u right)
是递归的,我的意思是我希望代码看起来像…'让我们插入xl=…'而不是让rec插入xl=…'我不明白你为什么要用折叠来插入。fold必须扫描所有列表元素,但insert不需要。如果它是一个家庭作业,它就不是一个好的作业,可能会让你感到困惑。
fold\u right
是递归的。我的意思是我希望代码看起来像…'让我们插入xl=…'而不是让rec插入xl=…'我不明白你为什么要用折叠来插入。fold必须扫描所有列表元素,但insert不需要。如果这是一个家庭作业,它不是一个好的,可能会混淆你。谢谢你的建议!谢谢你的建议!