1

我的 Ocaml 项目中有一个帮助功能,可以帮助将一个列表附加到另一个没有重复元素的列表。例如,追加list x: [d, e, f, g]list y [a, b, c, d],结果应该是 [a, b, c, d, e, f, g]

我写的函数是这样的:

    (* helper function checks if list contains element *)
let rec find e l =
    match l with
        [] -> false
        |(h::t) -> if (h = e) then true else find e t
;;

    (* helper function append l1 to l2 without duplicate *)
let rec help_append_list l1 l2 =
    match l1 with
        [] -> l2
        |(h::t) -> if (find h l2 = false) then (help_append_list t ([h]@l2)) else (help_append_list t l2)
;;

但是当我使用它时,这看起来不太好用,结果还是出现了重复的元素。

请看看上面的功能,给我一些关于如何纠正它们的建议......

谢谢你=)

4

1 回答 1

5

如果你使用Set,你只需要两个集合的并集就可以了。

如果l2inhelp_append_list没有重复,则您的函数可以正常工作。

假设xandy可以有自己的重复,并且顺序无关紧要,您可以使用:

let append_list x y = help_append_list x (help_append_list y [])

我对你的功能有一些意见。首先,与List 模块中的功能find相同。您可能想出于学习目的编写它,因此应替换为:existsif (h = e) then true else ...||

let rec find e = function
    | [] -> false
    | h::t -> h = e || find e t

其次,[h]@l2是一种低效的编写方式h::l2

let rec help_append_list l1 l2 =
    match l1 with
    | [] -> l2
    | h::t -> if find h l2 then help_append_list t l2
              else help_append_list t (h::l2)
于 2012-04-22T20:35:31.967 回答