我正在尝试实现一个应使用<依次插入的函数,如果x存在于S中,则S不变地返回。我在下面编写的代码未按预期输出。如果我有一个集合S = [2; 4]和x = [4; 6]。预期输出应为 [2; 4; 6]下面的代码输出[2; 4; 7]。感谢您提供任何解决此问题的帮助。谢谢。
let rec insert x S =
match S with
|[] -> x
|e::rest -> e::(insert S rest)
答案 0 :(得分:0)
我有一些建议可以帮助您进行编程:
x
和大写的S
,这令人困惑。insert
和S
上调用rest
,但是rest
是S
的一部分,因此没有任何意义。如果清楚的是什么,那您肯定会发现错误。printfn
,以便您可以实际看到正在发生的事情。这样一来,您可以自己解决问题。我正在按照我上面提出的建议重写您的代码。注意,我不只是更改变量名称的代码,而是添加一些printfn
let rec addToOrderedList orderedList listToBeAdded =
printfn "addToOrderedList %A %A" orderedList listToBeAdded
match listToBeAdded with
| [] -> printfn "nothing to add, finishing"
orderedList
| elem::restOfListToBeAdded -> printfn "adding element %A" elem
elem::(addToOrderedList listToBeAdded restOfListToBeAdded)
在最后一条指令中注意递归调用addToOrderedList listToBeAdded restOfListToBeAdded
。现在很明显,您正在尝试将restOfListToBeAdded
添加到listToBeAdded
中,这是不正确的。
实施中还有其他问题,但是我将让您自己解决,这是学习过程的一部分。提示:没有<
。
答案 1 :(得分:0)
您应该看看Set<'a> type。 Set模块提供了一个Set.union函数(或+运算符),它可以实现您想要的目标。
let insert lst1 lst2 =
Set.ofList lst1 + Set.ofList lst2
|> Set.toList