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