-5

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

我的第二个问题:创建两个函数,每个函数都将两个整数列表作为参数,并分别返回被视为集合的列表的并集和交集。您可能想要使用先前定义的成员函数。列表不需要排序,但不能有任何重复。

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

4

1 回答 1

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 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)

这不是最有效的解决方案,因为它没有使用尾递归,但它是最简单的开始。

于 2012-11-20T14:36:12.743 回答