让我们依次看一下每个过程,首先member
。请注意,member
Scheme 中已经有一个标准函数,因此定义一个具有相同名称的新过程是个坏主意。以下是现有member
程序的作用:
member
定位 lst 的第一个元素equal?
to v
。如果存在这样的元素,则返回以该元素开头的 lst 的尾部。否则,结果为#f
。
上述过程equal?
用于测试并返回与您期望的值不同的值。更接近预期的过程,我们有标准memq
功能:
memq
喜欢成员,但使用 eq? 查找元素。
但同样,返回的值不是您所期望的。我建议您像这样定义您的过程,注意我们正在使用memq
,并且根据约定,名称以 a 结尾?
表示这是一个布尔过程:
(define (member? atm lst)
(if (memq atm lst) #t #f))
现在让我们来看看duplicate-entries
。有几个括号问题(正确缩进代码会显示这一点),并且成员资格过程的名称存在问题(您的过程被调用member
但您将其调用为member?
)。您可以使用member?
我们上面刚刚定义的方法,或者使用memq
,这两种方法在这种情况下都可以正常工作,因为memq
如果找到元素将返回一个非假值,这将使条件为真:
(define (duplicate-entries lst)
(cond ((null? lst) #f)
((member? (car lst) (cdr lst)) #t)
(else (duplicate-entries (cdr lst)))))
或者这是推荐的方法 - 如果现有程序可以满足您的需要,则无需重新发明轮子:
(define (duplicate-entries lst)
(cond ((null? lst) #f)
((memq (car lst) (cdr lst)) #t)
(else (duplicate-entries (cdr lst)))))