2

试图从这个问题中理解一个答案。我编辑了代码看起来像这样但是它只返回[]

let rec intersect a b =
    let L1 = List.sort(a)
    let L2 = List.sort(b)
    match L1 with
    |h::t -> match L2 with
             |h2::t2 -> 
                 if h=h2 then h::(intersect t t2)
                 else if h>h2 then intersect t L2 else intersect L1 t2
             |[] -> []
    |[] -> [];;

intersect [1;2;3] [2;3;4]

我需要更改什么以使其返回相交值的列表(集)?

4

1 回答 1

2

使用 Set 类型可以找到 2 个列表的交集。这基本上是一个不可变的 HashSet。

let a = [1;2;3]
let b = [2;3;4]
let intersect a b = Set.intersect (set a) (set b) |> Set.toList

编辑:

Shredderroy 是正确的,您的逻辑在 else if 和 else 条件之间交换。此外,作为 F# 递归的介绍,您不应该有这样的返回,h::(intersect t t2)因为这不是正确的尾递归,如果列表足够长,可能会导致堆栈溢出。通过适当的尾递归,我最接近您的原始代码的是:

let intersect a b =
    let rec loopy L1 L2 acc =
        match L1 with
        |h::t -> 
            match L2 with
            |h2::t2 -> 
                if h=h2 then 
                    loopy t t2 (h::acc)
                elif h>h2 then 
                    loopy L1 t2 acc
                else 
                    loopy t L2 acc
                 |[] -> List.rev acc
        |[] -> List.rev acc
    loopy (List.sort a) (List.sort b) []
于 2013-10-08T01:53:43.833 回答