【问题标题】:Simple functions for SML/NJSML/NJ 的简单功能
【发布时间】:2013-10-20 05:46:19
【问题描述】:

我被要求为课堂上的问题编写一组函数。我认为我写它们的方式比它们需要的要复杂一些。我必须自己实现所有功能,而不使用和预定义的功能。我想知道这些答案是否有任何简单的“单行”版本?

  1. 集合可以表示为列表。集合的成员可以按任何顺序出现在列表中,但不应超过一个 列表中某个元素的出现。

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

我从来没有解决过一维问题,因为我花了一些时间才解决这些问题。有什么建议可以缩短这些吗?还有一个我没有遇到的问题,但我想知道如何解决它以供将来测试。

  1. (楼梯问题)您想上 n (>0) 级的楼梯。一次,您可以走一步、两步或三步。但, 例如,如果还剩一步,你只能走一步 一步,而不是两三步。有多少种不同的方法 上楼梯?用 sml 解决这个问题。 (一)解决它 递归地。 (b) 迭代求解。

关于如何解决这个问题的任何帮助?

【问题讨论】:

    标签: functional-programming sml smlnj


    【解决方案1】:

    你设置的函数看起来不错。除了格式和命名之外,我不会更改它们的任何主要内容:

    fun member (x, [])    = false
      | member (x, y::ys) = x = y orelse member (x, ys)
    
    fun dif ([],   B) = []
      | dif (a::A, B) = if member (a, B) then dif (A, B) else a::dif(A, B)
    
    fun union ([],   B) = B
      | union (a::A, B) = if member (a, B) then union (A, B) else a::union(A, B)
    
    (* Your cartesian looks nice as it is. Here is how you could do it using map: *)
    local val concat = List.concat
          val map = List.map
    in fun cartesian (A, B) = concat (map (fn a => map (fn b => (a,b)) B) A) end
    

    你的力量也很灵巧。如果你调用你的函数insert,它值得评论关于在许多列表中插入一些东西。也许insertEach 或类似名称是更好的名称。

    在您的最后一项任务中,由于这是一个计数问题,您不需要生成实际的步骤组合(例如步骤列表),只需计算它们即可。使用递归方法,尝试按照问题描述中的基本情况写下来。

    即,创建一个函数steps : int -> int,其中预先计算了采取 0、1 和 2 步的方式数,但是对于 n 步,n > 2,你知道有一组以 1、2 或 3 步开头的步数加上采取 n-1n-2 的数字组合和 n-3 个步骤。

    使用迭代方法,从底部开始,使用参数化计数变量。 (抱歉这里含糊的提示。)

    【讨论】:

      猜你喜欢
      • 2014-07-15
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2010-10-23
      • 2013-01-30
      • 2012-03-12
      相关资源
      最近更新 更多