首先编写一个名为mem的函数,给定一个整数和一个整数列表,如果整数在列表中至少出现一次则返回true,否则返回false。这是我的第一个问题,我不想使用任何内置函数。
我的第二个问题: 创建两个函数,每个函数将两个整数列表作为参数,并分别返回被视为集合的列表的并集和交集。你可能会想要使用普遍定义的成员函数。列表不需要排序,但它们不能重复。
我没有任何想法如何在没有任何内置功能的情况下解决这个问题 任何解决方案?
答案 0 :(得分:1)
如果您正在尝试学习F#,那么您应该尝试学习它而不是在StackOverflow上询问。然而,这两个问题听起来像一个合理的问题,实际上可以向社区的其他人展示一些基本的F#,所以这里有一些可能的解决方案。
成员测试可以实现为递归函数。我们的想法是,如果您找到所需的值,则可以遍历列表并返回true
。如果找到另一个值,则需要递归处理列表的其余部分。如果你到达终点(找到一个空列表),那么你返回false
,因为一个空列表(显然)不包含你正在寻找的值:
let rec mem value = function
| x::xs when x = value -> true
| x::xs -> mem value xs
| [] -> false
如何使用mem
实现工会?好吧,union将包含一个列表中的所有元素,以及另一个列表中尚未包含在第一个列表中的所有元素(您不想创建重复项)。因此,union list []
将是list
。如果第二个列表非空(x::xs
),则需要检查元素x
是否在第一个列表中。如果是,则要跳过它,否则将其添加到结果中:
let rec union list1 list2 =
match list2 with
| [] -> list1
| x::xs when mem x list1 -> union list1 xs
| x::xs -> x::(union list1 xs)
这不是最有效的解决方案,因为它不使用 tail-recursion ,但它是最简单的开始。