我想使用“成员”功能,如“eq”,“null”等。但是,我不知道如何修复它?
(define (member atm lst)
(cond
((null? lst) #F)
((eq? atm (car lst)) #T)
(else (member atm (cdr lst)))
)
)
我在哪里使用;
(define (duplicate-entries lst)
(cond
((null? lst) #F)
((member? (car lst) (cdr lst))) #T)
(else duplicate-entries (cdr lst))
)
)
member?
不起作用,我该如何解决?
答案 0 :(得分:2)
您使用member
定义了member?
功能。将member
定义为member?
,即(define (member? atm lst) ... )
答案 1 :(得分:1)
让我们依次看一下每个程序,member
。请注意,Scheme中已经有一个标准的member
函数,因此定义一个具有相同名称的新过程是个坏主意。以下是现有member
过程的作用:
member
找到equal?
到v
的第一个lst元素。如果存在这样的元素,则返回以该元素开头的lst的尾部。否则,结果为#f
。
上述过程使用equal?
进行测试,并返回与您预期的值不同的值。有点接近预期的程序,我们有标准的memq
函数:
memq
喜欢成员,但是使用eq找到一个元素。
但同样,返回的值不是您所期望的。我建议您定义这样的过程,注意我们正在使用memq
,并且根据约定,名称以?
结尾,表示这是一个布尔过程:
(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)))))