【问题标题】:Returning the list of elements occurring in just one list - SML返回仅在一个列表中出现的元素列表 - SML
【发布时间】:2012-10-19 04:59:41
【问题描述】:

如果 L1 = [1,2,3,4,5] 和 L2 [4,5,6,7,8],我想返回 [1,2,3,5,7,8],它们是仅出现在一个列表中的元素。我已经编写了一个函数,返回两个列表中出现的项目列表。

fun exists x nil = false | exists x (h::t) = (x = h) orelse (exists x t);

fun listAnd _ [] = []
  | listAnd [] _ = []
  | listAnd (x::xs) ys = if exists x ys  then x::(listAnd xs ys) 
else listAnd xs ys

我要查找的列表应该由 L1@L2 - (ListAnd L1 L2) 给出。我还发现了删除元素和删除重复项的函数。我多次尝试稍微更改 remDup 函数,以便它不会留下任何多次​​出现的项目的痕迹。无法让它工作。我不确定如何使用和组合所有这些功能以使其工作。

fun delete A nil = nil
| delete A (B::R) = if (A=B) then (delete A R) else (B::(delete A R));

fun remDups nil = nil
| remDups (A::R) = (A::(remDups (delete A R)));

【问题讨论】:

    标签: list sml


    【解决方案1】:

    如果有一个diff函数,其中diff xs ys返回xs中的所有元素,而不是ys中的所有元素,您可以轻松实现listOr函数:

    fun listOr xs ys = diff (xs@ys) (listAnd xs ys)
    

    diff 函数可以写成类似于listAnd

    fun diff xs [] = xs
      | diff [] _ = []
      | diff (x::xs) ys = if exists x ys  
                          then diff xs ys 
                          else x::(diff xs ys)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      相关资源
      最近更新 更多