递归合并F#中的两个列表

递归合并F#中的两个列表,f#,recursion,F#,Recursion,我想写一个递归函数来合并F中的整数列表# 我从这开始,但不知道下一步该怎么办 let rec merge xs ys = match xs with | [] -> ys | let li = [1;3;5;7;] let ll = [2;4;5;8;] 正如我在评论中所说,如果您同时在xs和ys上进行模式匹配,可能最简单: let rec merge xs ys = match xs,ys with | [],l | l,[] -> l

我想写一个递归函数来合并F中的整数列表#

我从这开始,但不知道下一步该怎么办

let rec merge xs ys =
    match xs with
    | [] -> ys
    | 

let li = [1;3;5;7;]
let ll = [2;4;5;8;]

正如我在评论中所说,如果您同时在xs和ys上进行模式匹配,可能最简单:

let rec merge xs ys = 
  match xs,ys with
  | [],l | l,[] -> l
  | x::xs', y::ys' -> 
     if x < y then x :: (merge xs' ys) //'
     else y :: (merge xs ys')          //'
let rec merge xs ys=
将xs、ys与
|[],l | l,[]->l
|x::xs',y::ys'->
如果x
您已经有了一个正确的基本情况:如果xs为空,只需返回ys即可

同样,如果ys为空,则返回xs

对于xs和ys都不是空的情况,您需要查看xs和ys的第一个元素(我们称它们为x和y):

如果x小于y,则需要将其插入最终列表中y之前。因此,取
y
并将xs的尾部与ys(包括y)合并的结果作为前缀


否则的话,你就得先来。因此,在将xs(包括x)与ys的尾部合并的结果前面加上y。

这不是递归的,但如果输入没有排序:

let merge xs ys = (Seq.append xs ys) |> Seq.sort |> Seq.toList

我不认为这是一个递归问题

let a = [1;3;5]
let b = [2;4;6]

let c = Seq.append a b |> Seq.sort
fsi会话的输出: c:

valit:seq=seq[1;2;3;4;…]

我找到了一种可能符合询问者要求的方法。就我而言,我必须解决同样的问题,而且几乎没有上一周的F#课程,所以整个语法没有在课堂上讨论,当我看到上面的答案是使用多重匹配(
match lst1,list2 with…
)时,我立刻意识到了它的用途,但教授不允许它的使用,因此,我不得不想出另一个选择。尽管它基本上是相同的算法,但它使用的是更基本的代码。我只是觉得我应该把它贴出来=)

让rec merge2 list1 list2=
让head list=匹配具有|[]->0 | h::t->h的列表
让tail list=将列表与|[]->[]h::t->t匹配
将列表1与
| [] -> []
|h::t->
//list2的头为0,则列表为空,然后返回第一个列表中的内容
//(即没有第二个列表的更多值可供比较)
如果head list2=0,则list1
如果h
我将使用List.fold执行此操作:

let merge a b =
    List.fold (fun acc x ->
        if List.exists ((=)x) acc = false then
            elem :: acc
        else
            acc
    ) (List.sort a) b

不过,这可能不是最快的方式。

你说的“合并”是什么意思?您正在尝试从每个列表中替换项目吗?或者它们总是从一开始就被排序,并且您希望输出也被排序?@kvb我希望合并列表被排序。1,2,3,4,5,5,7,8作为提示,如果同时在
xs
ys
上进行模式匹配(使用
match xs,ys with…
),可能会更容易。代码不错。这假设输入是从开始排序的。通过生成子函数并将新集合传递到该函数调用中,可以很容易地将其变为尾部递归。尝试将其与[1;9]和[2;9]一起使用,例如,它将返回[1;2;9;9]。您应该使用“else merge xs ys”来处理这个子句,一切都会好起来的
let rec merge2 list1 list2 = 
    let head list = match list with | [] -> 0 | h::t -> h
    let tail list = match list with | [] -> [] | h::t -> t
    match list1 with
    | [] -> []
    | h::t -> 
        //list2's head is 0 then list is empty then return whats in the first list 
        //(i.e no more values of second list to compare)
        if head list2 = 0 then list1
        elif h < head list2 then h :: merge2 t list2 
        else head list2 :: merge2 list1 (tail list2)
let merge a b =
    List.fold (fun acc x ->
        if List.exists ((=)x) acc = false then
            elem :: acc
        else
            acc
    ) (List.sort a) b