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

时间:2010-11-04 19:03:08

标签: f# recursion

我希望编写一个递归函数来合并F#

中的两个整数列表

我从这开始,但不知道下一步该做什么。

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

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

6 个答案:

答案 0 :(得分:6)

正如我在评论中所说,如果你同时在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')          //'

答案 1 :(得分:2)

我发现了一种可能适合提问者想要的方式。我一个人必须解决这个同样的问题,几乎没有给F#上课一周的课程,所以整个语法没有在课堂上讨论,当我看到上面的答案使用多个匹配(match lst1, list2 with ...)我立即意识到它的使用,但教授不允许它的使用,因此我不得不提出另一种选择。即使认为它基本上是相同的算法,它使用更基本的代码。只是想我应该发布它=)

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)

答案 2 :(得分:1)

你已经有一个正确的基本情况:如果xs为空,只需返回ys。

同样,如果y为空,则返回xs。

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

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

否则你需要先来。因此,将xs(包括x)与ys尾部合并的结果前缀为。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

let c = Seq.append a b |> Seq.sort

来自fsi会话的输出: C:

val it : seq<int> = seq [1; 2; 3; 4; ...]

答案 5 :(得分:0)

我会使用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

但这可能不是最快的方法。