我希望编写一个递归函数来合并F#
中的两个整数列表我从这开始,但不知道下一步该做什么。
let rec merge xs ys =
match xs with
| [] -> ys
|
let li = [1;3;5;7;]
let ll = [2;4;5;8;]
答案 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
但这可能不是最快的方法。