Lisp 我需要在Racket中创建一个函数,从列表中删除彼此相似的元素

Lisp 我需要在Racket中创建一个函数,从列表中删除彼此相似的元素,lisp,racket,paradigms,Lisp,Racket,Paradigms,我需要在Racket中创建一个函数,但我发现示例有点混乱。我需要创建一个函数,从列表中删除彼此相似的元素。您可以传递一个确定相似性与否的函数(此函数是可选的)。默认情况下,如果元素相等,则使用eq?功能。您可以假定相似性函数始终是对称的。只要元素的值大于1,我就使用它来删除它们的出现。好的是这两个函数都有一个proc参数用作谓词。此外,我使用helper两次获取相同的输入列表,但使用方式不同:l1用于重复,而l2用作累加器 (define (remove-similars l f) (def

我需要在Racket中创建一个函数,但我发现示例有点混乱。我需要创建一个函数,从列表中删除彼此相似的元素。您可以传递一个确定相似性与否的函数(此函数是可选的)。默认情况下,如果元素相等,则使用eq?功能。您可以假定相似性函数始终是对称的。

只要元素的值大于1,我就使用它来删除它们的出现。好的是这两个函数都有一个
proc
参数用作谓词。此外,我使用helper两次获取相同的输入列表,但使用方式不同:
l1
用于重复,而
l2
用作累加器

(define (remove-similars l f)
  (define (remove-lsts l1 l2 f)
    (cond [(empty? l1) l2]
          [else (if (> (count (lambda (e) (f e (first l1))) l2) 1)
                    (remove-lsts (rest l1) (remove* (list (first l1)) l2 f) f)
                    (remove-lsts (rest l1) l2 f))]))
  (remove-lsts l l f))

这里有一种方法可以做到这一点:

  • 从我们收集的元素的空列表和重复项的空列表开始
  • 查看我们试图筛选的列表:
    • 如果为空,则返回我们正在收集的列表的反面
    • 如果它不是空的:
      • 检查第一个元素是否与我们已经看到的任何重复元素相似:如果相似,只需迭代列表的其余部分
      • 如果不是,则检查它是否与列表其余部分的任何元素相似:如果是,则它是重复的,因此迭代列表其余部分,将第一个元素添加到重复列表中
      • 如果不是这两个元素中的任何一个,那么它必须是唯一的,因此在列表的其余部分迭代,将第一个元素添加到正在收集的元素列表中
根据您允许使用的球拍数量,有必要知道
(成员元素l相似?
将使用
相似?
作为谓词检查
元素
是否在
l
中。如果你不被允许使用它,那么你可以相当容易地编写它

还可以定义一个函数,该函数接受一个带有默认值的可选参数

(define (find-similar list (test? similar))
  ...)

这将使
test?
成为测试函数,它的默认值将是
类似的
值。

我称之为
保持唯一的
。不要以输出中没有的内容命名函数。(至少尝试一下;有时它确实有意义。)大概您收到了一条错误消息和该bug。那是什么?因为你没有在问题中包含你的函数,没有人能猜出问题是什么。