如何在没有任何内置函数的列表中查看int是否存在?

时间:2012-11-20 14:26:25

标签: f#

首先编写一个名为mem的函数,给定一个整数和一个整数列表,如果整数在列表中至少出现一次则返回true,否则返回false。这是我的第一个问题,我不想使用任何内置函数。

我的第二个问题: 创建两个函数,每个函数将两个整数列表作为参数,并分别返回被视为集合的列表的并集和交集。你可能会想要使用普遍定义的成员函数。列表不需要排序,但它们不能重复。

我没有任何想法如何在没有任何内置功能的情况下解决这个问题 任何解决方案?

1 个答案:

答案 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 ,但它是最简单的开始。