【发布时间】:2013-10-20 05:46:19
【问题描述】:
我被要求为课堂上的问题编写一组函数。我认为我写它们的方式比它们需要的要复杂一些。我必须自己实现所有功能,而不使用和预定义的功能。我想知道这些答案是否有任何简单的“单行”版本?
- 集合可以表示为列表。集合的成员可以按任何顺序出现在列表中,但不应超过一个 列表中某个元素的出现。
(a) 定义 dif(A, B) 为 计算 A 和 B 的集合差,A-B。
(b) 定义笛卡尔(A, B) 计算集合 A 和集合 B 的笛卡尔积,{ (a, b) | a∈A,b∈B}。
(c) 考虑数学归纳证明 以下:如果集合 A 有 n 个元素,则 A 的幂集有 2n 元素。在证明之后,定义 powerset(A) 来计算 集合 A, { B | 的幂集B ⊆ A }。
(d) 定义一个函数,给定 一个集合 A 和一个自然数 k,返回所有子集的集合 大小为 k 的 A。
(* Takes in an element and a list and compares to see if element is in list*)
fun helperMem(x,[]) = false
| helperMem(x,n::y) =
if x=n then true
else helperMem(x,y);
(* Takes in two lists and gives back a single list containing unique elements of each*)
fun helperUnion([],y) = y
| helperUnion(a::x,y) =
if helperMem(a,y) then helperUnion(x,y)
else a::helperUnion(x,y);
(* Takes in an element and a list. Attaches new element to list or list of lists*)
fun helperAttach(a,[]) = []
helperAttach(a,b::y) = helperUnion([a],b)::helperAttach(a,y);
(* Problem 1-a *)
fun myDifference([],y) = []
| myDifference(a::x,y) =
if helper(a,y) then myDifference(x,y)
else a::myDifference(x,y);
(* Problem 1-b *)
fun myCartesian(xs, ys) =
let fun first(x,[]) = []
| first(x, y::ys) = (x,y)::first(x,ys)
fun second([], ys) = []
| second(x::xs, ys) = first(x, ys) @ second(xs,ys)
in second(xs,ys)
end;
(* Problem 1-c *)
fun power([]) = [[]]
| power(a::y) = union(power(y),insert(a,power(y)));
我从来没有解决过一维问题,因为我花了一些时间才解决这些问题。有什么建议可以缩短这些吗?还有一个我没有遇到的问题,但我想知道如何解决它以供将来测试。
- (楼梯问题)您想上 n (>0) 级的楼梯。一次,您可以走一步、两步或三步。但, 例如,如果还剩一步,你只能走一步 一步,而不是两三步。有多少种不同的方法 上楼梯?用 sml 解决这个问题。 (一)解决它 递归地。 (b) 迭代求解。
关于如何解决这个问题的任何帮助?
【问题讨论】:
标签: functional-programming sml smlnj