代码之家  ›  专栏  ›  技术社区  ›  Maslo Kar

求你了,帮帮我。我是个初学者,我真的不懂

  •  -3
  • Maslo Kar  · 技术社区  · 3 年前

    编写函数 min_max : int list -> int * int 它接受一个非空的数字列表,并返回列表中最小和最大数字的一对(min,max)。

    以下是我迄今为止所写的内容。

    fun min_max (n : int list) =
      if null n then NONE
      else
        let
          fun max (n : int list) =
            if null (tl n) then hd n
            else
              let 
                val mn = max (tl n)
              in 
                if hd n > mn then hd n
                else mn
              end 
    
          fun min (n : int list) =
            if null (tl n) then hd n
            else
              let 
                val mix = min (tl n)
              in 
                if hd n < mix then hd n
                else mix
              end
        in
          SOME (min :: max)
        end;
    
    0 回复  |  直到 3 年前
        1
  •  0
  •   Chris    3 年前

    你写的大部分内容 作品 你的 min max 功能 工作 .

    SOME (min :: max)
    

    不过,这不起作用。

    这不是构建值的“对”或“元组”的方式。相当地

    SOME (min, max)
    

    此外,现在只有两个 功能 。你需要 申请 列表中的那些函数 n 以获得您想要的结果。

    SOME (min n, max n)
    

    作为一个建议,您可以使用模式匹配,通过避免 hd tl 以及替换尾部的条件测试。例如:

    fun min([n]) = n
      | min(h::t) = 
          let 
            val m = min(t) 
          in 
            if h < m then h
            else m 
          end;
    

    但我们知道 h::t 表示一个至少有两个元素的列表,因此我们可以将名称绑定到模式中的这些元素。

    fun min([n]) = n
      | min(x::(tl as y::z)) = 
          if x < y then min(x::z) 
          else min(tl);
    

    如果我们在清单上对此进行评估,我们可以看到它将如何进行。

    min([7,8,2,4,6,1,9])
    min(7::[2,4,6,1,9])
    min([2,4,6,1,9])
    min(2::[6,1,9])
    min(2::[1,9])
    min([1,9])
    min(1::[])  ->  min([1]) 
    1
    

    这也有尾部递归的好处。